Skip to content

v2.9.0

Compare
Choose a tag to compare
@tdewolff tdewolff released this 26 Aug 14:12
· 858 commits to master since this release
3630c79
  • Add JS (ECMAScript 2020) minifier
  • Improve benchmark functions
  • Predefine byte-slices instead of inline for performance
  • Don't check write errors to output during minification, but check at the end only
  • Lexers/parser now require passing parse.Input instead of io.Reader
  • Rename subpackage min to minify

JS minifier overview

Features:

  • remove superfluous whitespace
  • remove superfluous semicolons
  • shorten true, false, and undefined to !0, !1 and void 0
  • rename variables and functions to shorter names (not in global scope)
  • move var declarations to the top of the global/function scope (if more than one)
  • collapse if/else statements to expressions
  • minify conditional expressions to simpler ones
  • merge sequential expression statements to one, including into return and throw
  • remove superfluous grouping in expressions
  • shorten or remove string escapes
  • convert object key or index expression from string to identifier or decimal
  • merge concatenated strings
  • rewrite numbers (binary, octal, decimal, hexadecimal) to shorter representations

It compresses files at about 25 MB/s (only minifying, not considering reading/writing files) which is (much) faster than existing minifiers. Compression rate is between 1.5 and 3.0 depending on the file (respectively, the compression file size is between 35% -- 65% of the original). Example of known files:

File Original Size Compressed Size Ratio Time Speed
ace.js 644 kB 346 kB 53.7% 34ms 19 MB/s
dot.js 5.2 kB 3.3 kB 64.9% 563µs 9.2 MB/s
jquery.js 247 kB 85 kB 34.4% 11ms 22 MB/s
jqueryui.js 470 kB 241 kB 51.3% 26ms 18 MB/s
moment.js 99 kB 35 kB 34.9% 4ms 24 MB/s

The minifier has been tested for a number of web applications including WordPress. The go-fuzz fuzzer has been used extensively in order to detect bugs, and will continue finding bugs using https://github.com/google/oss-fuzz