resize-observer-polyfill icon indicating copy to clipboard operation
resize-observer-polyfill copied to clipboard

Build tweaks

Open Andarist opened this issue 5 years ago • 0 comments

So this is a PR attempting to optimize (many times doing micro optimizations) the final bundle.

I've checked the bundle size by executing:

npm run build && npx terser -cm --toplevel dist/ResizeObserver.es.js | gzip -c | wc -c

Before my PR this has reported the size of 2436. After that I have dropped buble and migrated to babel@7 which got me to 2571. So this was a little bit of a regression. However I've started to optimizing various patterns used across the codebase (you can follow my commits) and I was able to go down to 2444, which is only slight regression (8 bytes). Later I've prepared so called browser build which allowed me to drop environment checks for the browser and that bundle is now sitting at 2367 bytes (69 bytes improvement).

I realize this is not much, but it was fun to do nevertheless.

Right now 3 tests are failing on my machine, I'm happy to fix them, but I don't know how do you feel about changes that I have made here, so I'd like to get a preliminary review/approval first and only proceed with fixing tests after that.

A nice side effect of this PR is that it should make the library tree-shakeable, I have not tested it yet - but by inspecting the final bundle I havent found any more tree-shaking deopts.

PS. We could easily go down to 2351 (another 16 bytes) by removing undefined class properties from the class definition in places where they are assigned in the constructor, that is because the output code looks something like this:

function Constructor() {
  this.field = void 0;
  this.field = someAssignedValue;
}

The first statement is obviously not needed, but as part of the class declaration it was annotated with JSDocs and I was unsure how to convert it to annotate it only in the constructor (or somewhere else, without actually declaring it on the class). I might be able to implement this small optimization as part of the Babel itself, so maybe its not worth optimizing right now and better to wait for a new babel release which will have this optimization in the future automatically.

Andarist avatar Nov 20 '18 16:11 Andarist