Skip to content

πŸƒβ€β™‚οΈπŸƒβ€β™€οΈπŸƒ JS minification benchmarks: babel-minify, esbuild, terser, uglify-js, swc, google closure compiler, tdewolff/minify

License

Notifications You must be signed in to change notification settings

JohnnyFangJr/minification-benchmarks

Β 
Β 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

πŸƒβ€β™‚οΈπŸƒβ€β™€οΈπŸƒ JS minification benchmarks

This repo is routinely maintained to compare the quality and speed across the latest versions of the following JavaScript minifiers:

Benchmarks last updated on Jan 7, 2022.

Support this project by ⭐️ starring and sharing it. Follow me to see what other cool projects I'm working on! ❀️

πŸ™‹β€β™‚οΈ Why?

  1. To help you pick a minifier that fits your needs
  2. To promote JS minifiers and document their performances
  3. To encourage healthy competition and improvement amongst minifiers

πŸ‘Ÿ Methodology

  • Each minifier is executed in its own process with a 20 second timeout
  • Artifact integrity is verified by a test before and after minification
  • Minifier upgrade PRs are automated via WhiteSource Renovate
  • Benchmarks are gathered on every PR via GitHub Actions (verifiable minified artifacts are uploaded on each run)

⏱ Metrics

Minifiers are ranked by smallest minzipped size.

Minified size

Size of the minified output.

Minzipped size

Size of the minified output with Gzip compression.

For minifiers, this measures how compressable the output is.

For users, this measures network transfer size, which is usually the metric that matters most.

Time

How long minification took (average of 5 runs). Each time is annotated with a multiplier relative to the fastest minifier.

πŸ“‹ Results

Artifact Original size Gzip size
react v17.0.1 (Source) 72.14 kB 19.46 kB
Minifier Minified size Minzipped size Time
google-closure-compiler.simple -68% 22.83 kB πŸ†-58% 8.17 kB 265x 3,823 ms
uglify-js πŸ†-68% 22.80 kB -58% 8.21 kB 48x 702 ms
terser -68% 23.12 kB -57% 8.29 kB 24x 357 ms
swc -68% 23.10 kB -57% 8.33 kB 2x 40 ms
babel-minify -67% 23.53 kB -57% 8.38 kB 66x 955 ms
esbuild -67% 23.70 kB -56% 8.53 kB 1x 18 ms
uglify-js.no-compress -65% 25.06 kB -56% 8.65 kB 9x 130 ms
terser.no-compress -65% 25.08 kB -55% 8.73 kB 11x 160 ms
tdewolff-minify -67% 23.65 kB -55% 8.75 kB πŸ† 14 ms

Artifact Original size Gzip size
moment v2.29.1 (Source) 173.90 kB 36.53 kB
Minifier Minified size Minzipped size Time
uglify-js -66% 58.33 kB πŸ†-49% 18.50 kB 135x 1,996 ms
terser -66% 59.06 kB -49% 18.59 kB 67x 991 ms
babel-minify -66% 59.11 kB -49% 18.67 kB 158x 2,321 ms
google-closure-compiler.simple πŸ†-66% 58.27 kB -49% 18.79 kB 298x 4,383 ms
swc -66% 58.99 kB -49% 18.80 kB 5x 82 ms
esbuild -66% 59.89 kB -47% 19.30 kB 1x 26 ms
uglify-js.no-compress -64% 63.01 kB -47% 19.53 kB 25x 379 ms
terser.no-compress -64% 63.15 kB -46% 19.60 kB 26x 396 ms
tdewolff-minify -66% 59.95 kB -46% 19.67 kB πŸ† 15 ms

Artifact Original size Gzip size
jquery v3.5.1 (Source) 287.63 kB 84.73 kB
Minifier Minified size Minzipped size Time
uglify-js πŸ†-69% 88.82 kB πŸ†-63% 30.97 kB 99x 2,376 ms
terser -69% 89.88 kB -63% 31.02 kB 53x 1,278 ms
swc -69% 89.43 kB -63% 31.12 kB 6x 164 ms
uglify-js.no-compress -67% 94.26 kB -63% 31.58 kB 17x 417 ms
terser.no-compress -67% 94.55 kB -63% 31.69 kB 23x 567 ms
babel-minify -68% 91.93 kB -63% 31.73 kB 163x 3,898 ms
esbuild -69% 90.20 kB -62% 31.98 kB 1x 37 ms
tdewolff-minify -69% 89.93 kB -62% 32.16 kB πŸ† 24 ms
google-closure-compiler.simple -68% 92.70 kB -61% 33.06 kB 211x 5,058 ms

Artifact Original size Gzip size
vue v2.6.12 (Source) 342.15 kB 90.12 kB
Minifier Minified size Minzipped size Time
uglify-js πŸ†-66% 115.04 kB πŸ†-53% 42.55 kB 97x 3,121 ms
terser -66% 116.77 kB -52% 42.91 kB 47x 1,526 ms
swc -66% 116.79 kB -52% 43.00 kB 7x 244 ms
babel-minify -66% 117.61 kB -51% 43.72 kB 129x 4,132 ms
google-closure-compiler.simple -66% 115.60 kB -51% 44.11 kB 164x 5,253 ms
esbuild -65% 118.32 kB -51% 44.30 kB 1x 47 ms
uglify-js.no-compress -63% 126.39 kB -51% 44.47 kB 15x 497 ms
terser.no-compress -63% 126.58 kB -50% 44.64 kB 18x 602 ms
tdewolff-minify -65% 118.17 kB -50% 45.10 kB πŸ† 32 ms

Artifact Original size Gzip size
lodash v4.17.21 (Source) 544.10 kB 97.26 kB
Minifier Minified size Minzipped size Time
uglify-js πŸ†-87% 69.66 kB πŸ†-75% 24.57 kB 100x 2,440 ms
google-closure-compiler.simple -86% 73.47 kB -74% 24.91 kB 214x 5,222 ms
babel-minify -87% 71.81 kB -74% 25.13 kB 136x 3,322 ms
terser -87% 71.09 kB -74% 25.16 kB 57x 1,399 ms
swc -87% 70.43 kB -74% 25.31 kB 9x 236 ms
uglify-js.no-compress -86% 75.44 kB -73% 25.90 kB 20x 505 ms
esbuild -87% 72.49 kB -73% 26.14 kB 2x 57 ms
terser.no-compress -86% 75.67 kB -73% 26.17 kB 22x 556 ms
tdewolff-minify -87% 72.55 kB -72% 26.95 kB πŸ† 24 ms

Artifact Original size Gzip size
d3 v6.3.1 (Source) 555.77 kB 130.55 kB
Minifier Minified size Minzipped size Time
uglify-js πŸ†-52% 265.31 kB πŸ†-33% 87.24 kB 104x 5,987 ms
terser -52% 267.99 kB -33% 87.92 kB 56x 3,248 ms
uglify-js.no-compress -50% 276.12 kB -32% 88.63 kB 16x 966 ms
terser.no-compress -50% 276.47 kB -32% 89.16 kB 23x 1,366 ms
swc -51% 270.24 kB -31% 90.00 kB 17x 1,020 ms
esbuild -51% 270.20 kB -31% 90.63 kB 1x 86 ms
tdewolff-minify -51% 270.08 kB -30% 91.16 kB πŸ† 58 ms
google-closure-compiler.simple -51% 270.30 kB -28% 93.68 kB 131x 7,591 ms
babel-minify Failed to minify β€” β€” β€”

Artifact Original size Gzip size
terser v5.10.0 (Source) 905.11 kB 181.62 kB
Minifier Minified size Minzipped size Time
uglify-js -54% 412.56 kB πŸ†-36% 116.87 kB 75x 4,702 ms
terser -54% 416.03 kB -36% 117.04 kB 47x 2,947 ms
terser.no-compress -52% 430.30 kB -35% 117.95 kB 19x 1,218 ms
uglify-js.no-compress -53% 428.78 kB -35% 118.07 kB 16x 1,033 ms
google-closure-compiler.simple πŸ†-56% 398.69 kB -34% 119.30 kB 113x 7,071 ms
tdewolff-minify -54% 415.03 kB -34% 119.33 kB πŸ† 62 ms
esbuild -54% 417.20 kB -34% 119.84 kB 1x 88 ms
babel-minify Failed to minify β€” β€” β€”
swc Invalid output: TypeError β€” β€” β€”

Artifact Original size Gzip size
three v0.124.0 (Source) 1.25 MB 249.01 kB
Minifier Minified size Minzipped size Time
uglify-js πŸ†-48% 644.18 kB πŸ†-36% 158.60 kB 84x 7,866 ms
terser -48% 653.38 kB -36% 159.14 kB 47x 4,397 ms
swc -48% 649.71 kB -36% 160.13 kB 11x 1,063 ms
babel-minify -48% 645.34 kB -35% 161.44 kB 162x 15,145 ms
google-closure-compiler.simple -48% 644.45 kB -35% 162.42 kB 103x 9,613 ms
uglify-js.no-compress -46% 675.43 kB -35% 162.89 kB 16x 1,557 ms
terser.no-compress -46% 675.60 kB -35% 162.91 kB 18x 1,747 ms
esbuild -48% 646.99 kB -34% 163.24 kB 1x 145 ms
tdewolff-minify -48% 648.26 kB -33% 166.78 kB πŸ† 93 ms

Artifact Original size Gzip size
victory v35.8.4 (Source) 2.14 MB 312.17 kB
Minifier Minified size Minzipped size Time
terser -66% 715.74 kB πŸ†-49% 159.01 kB 60x 6,351 ms
uglify-js -67% 707.08 kB -49% 159.14 kB 91x 9,646 ms
swc -66% 716.02 kB -48% 161.16 kB 12x 1,289 ms
terser.no-compress -64% 759.34 kB -47% 166.63 kB 22x 2,380 ms
uglify-js.no-compress -65% 756.58 kB -46% 167.61 kB 18x 1,974 ms
tdewolff-minify -66% 719.75 kB -45% 172.08 kB πŸ† 105 ms
google-closure-compiler.simple πŸ†-67% 705.87 kB -44% 175.18 kB 104x 10,943 ms
esbuild -66% 724.30 kB -42% 180.45 kB 1x 177 ms
babel-minify Failed to minify β€” β€” β€”

Artifact Original size Gzip size
echarts v5.1.1 (Source) 3.20 MB 689.67 kB
Minifier Minified size Minzipped size Time
terser -69% 1.00 MB πŸ†-53% 322.12 kB 42x 8,710 ms
uglify-js πŸ†-69% 983.84 kB -53% 326.05 kB 81x 16,526 ms
terser.no-compress -66% 1.07 MB -52% 330.73 kB 19x 3,874 ms
esbuild -68% 1.01 MB -52% 331.66 kB 1x 379 ms
uglify-js.no-compress -67% 1.07 MB -52% 331.66 kB 12x 2,580 ms
tdewolff-minify -68% 1.01 MB -51% 339.05 kB πŸ† 203 ms
babel-minify Timed out β€” β€” β€”
google-closure-compiler.simple Timed out β€” β€” β€”
swc Invalid output: SyntaxError β€” β€” β€”

Artifact Original size Gzip size
antd v4.16.1 (Source) 6.69 MB 833.49 kB
Minifier Minified size Minzipped size Time
uglify-js πŸ†-68% 2.14 MB πŸ†-45% 455.89 kB 64x 16,245 ms
terser -66% 2.25 MB -45% 461.42 kB 41x 10,289 ms
swc -66% 2.27 MB -44% 463.54 kB 14x 3,556 ms
terser.no-compress -64% 2.43 MB -42% 479.86 kB 17x 4,451 ms
uglify-js.no-compress -64% 2.42 MB -42% 482.98 kB 14x 3,677 ms
tdewolff-minify -66% 2.30 MB -41% 490.51 kB πŸ† 251 ms
esbuild -65% 2.31 MB -41% 491.09 kB 2x 559 ms
babel-minify Timed out β€” β€” β€”
google-closure-compiler.simple Timed out β€” β€” β€”

Want to see more projects listed? PRs welcome! See the contribution guide for more info.

πŸ₯‡ Results

Best minification performance

UglifyJS takes first place for the smallest uncompressed minified size for all races, and wins 9 out of 11 races for minzipped size! Impressively, it's still written in ES5 but can handle ES6 up to ES2020.

Terser takes a very close second, only short by at most by 1% in minzipped size while performing twice as fast as Uglify! Terser is a fork of UglifyJS and comes with support for ES6+.

Fastest minifier

esbuild runs 10x+ laps around everyone else! The Go-lang JS minifier/bundler is a beast of its own. Not only is it insanely fast, but demonstrates very competitive minification abilities, usually performing closely to Terser while supporting cutting-edge ESNext syntax. However, note that esbuild has a limited set of optimizations and there are currently no plans to improve it.

⚑️ Pro Tip: Harness the speed of esbuild in your Webpack build for minification (and even transpilation) with esbuild-loader.

Definitely keep an eye out for swc, the JS compiler written in Rust. It's also blazing fast and rumor has it they're stepping up their minification.

About

πŸƒβ€β™‚οΈπŸƒβ€β™€οΈπŸƒ JS minification benchmarks: babel-minify, esbuild, terser, uglify-js, swc, google closure compiler, tdewolff/minify

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • TypeScript 100.0%