minification-benchmarks icon indicating copy to clipboard operation
minification-benchmarks copied to clipboard

🏃‍♂️🏃‍♀️🏃 JS minification benchmarks: babel-minify, esbuild, terser, uglify-js, swc, google closure compiler, tdewolff/minify

🏃‍♂️🏃‍♀️🏃 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 Aug 23, 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.2 (Source) 72.14 kB 19.41 kB
Minifier Minified size Minzipped size Time
google-closure-compiler -68% 22.83 kB 🏆-58% 8.17 kB 213x 4,503 ms
uglify-js 🏆-69% 22.67 kB -58% 8.19 kB 36x 777 ms
swc -68% 22.98 kB -57% 8.28 kB 1x 26 ms
terser -68% 23.12 kB -57% 8.29 kB 18x 393 ms
babel-minify -67% 23.60 kB -57% 8.43 kB 59x 1,252 ms
esbuild -67% 23.70 kB -56% 8.53 kB 1x 24 ms
tdewolff-minify -67% 23.53 kB -56% 8.62 kB 🏆 21 ms
uglify-js.no-compress -65% 25.03 kB -55% 8.65 kB 6x 147 ms
terser.no-compress -65% 25.08 kB -55% 8.72 kB 8x 183 ms

Artifact Original size Gzip size
moment v2.29.1 (Source) 173.90 kB 36.15 kB
Minifier Minified size Minzipped size Time
uglify-js 🏆-67% 57.88 kB 🏆-49% 18.46 kB 90x 1,701 ms
terser -66% 59.06 kB -49% 18.53 kB 55x 1,051 ms
google-closure-compiler -66% 58.27 kB -48% 18.75 kB 249x 4,704 ms
swc -66% 58.86 kB -48% 18.83 kB 3x 72 ms
babel-minify -66% 59.70 kB -47% 19.02 kB 132x 2,496 ms
esbuild -66% 59.83 kB -47% 19.25 kB 1x 35 ms
tdewolff-minify -66% 59.94 kB -46% 19.42 kB 🏆 19 ms
uglify-js.no-compress -64% 62.50 kB -46% 19.44 kB 16x 314 ms
terser.no-compress -64% 63.15 kB -46% 19.56 kB 23x 447 ms

Artifact Original size Gzip size
jquery v3.5.1 (Source) 287.63 kB 84.37 kB
Minifier Minified size Minzipped size Time
uglify-js 🏆-69% 88.55 kB 🏆-63% 30.86 kB 60x 2,473 ms
terser -69% 89.88 kB -63% 30.93 kB 35x 1,467 ms
swc -69% 89.26 kB -63% 30.94 kB 2x 121 ms
tdewolff-minify -69% 89.85 kB -63% 31.44 kB 🏆 41 ms
uglify-js.no-compress -67% 94.08 kB -63% 31.44 kB 10x 429 ms
terser.no-compress -67% 94.55 kB -63% 31.59 kB 14x 596 ms
babel-minify -68% 92.10 kB -62% 31.75 kB 96x 3,950 ms
esbuild -69% 90.07 kB -62% 31.89 kB 1x 67 ms
google-closure-compiler -68% 92.70 kB -61% 32.98 kB 123x 5,069 ms

Artifact Original size Gzip size
vue v2.6.12 (Source) 342.15 kB 89.52 kB
Minifier Minified size Minzipped size Time
terser -66% 116.77 kB 🏆-52% 42.83 kB 40x 1,925 ms
uglify-js 🏆-67% 113.99 kB -52% 42.87 kB 65x 3,092 ms
swc -66% 116.51 kB -52% 42.96 kB 3x 176 ms
babel-minify -66% 117.90 kB -51% 43.83 kB 92x 4,388 ms
google-closure-compiler -66% 115.60 kB -51% 44.05 kB 113x 5,394 ms
esbuild -65% 118.16 kB -51% 44.25 kB 1x 75 ms
uglify-js.no-compress -63% 126.14 kB -50% 44.36 kB 10x 479 ms
tdewolff-minify -66% 117.83 kB -50% 44.37 kB 🏆 47 ms
terser.no-compress -63% 126.58 kB -50% 44.57 kB 15x 741 ms

Artifact Original size Gzip size
lodash v4.17.21 (Source) 544.10 kB 96.40 kB
Minifier Minified size Minzipped size Time
uglify-js 🏆-87% 68.26 kB 🏆-75% 24.56 kB 75x 2,543 ms
google-closure-compiler -86% 73.47 kB -74% 24.84 kB 159x 5,379 ms
terser -87% 71.09 kB -74% 25.06 kB 46x 1,578 ms
swc -87% 70.48 kB -74% 25.32 kB 4x 152 ms
babel-minify -87% 72.37 kB -74% 25.37 kB 105x 3,555 ms
uglify-js.no-compress -86% 74.61 kB -73% 25.76 kB 13x 444 ms
esbuild -87% 72.49 kB -73% 26.06 kB 1x 51 ms
terser.no-compress -86% 75.67 kB -73% 26.10 kB 19x 655 ms
tdewolff-minify -87% 72.47 kB -73% 26.32 kB 🏆 34 ms

Artifact Original size Gzip size
d3 v6.3.1 (Source) 555.77 kB 129.99 kB
Minifier Minified size Minzipped size Time
uglify-js 🏆-52% 264.08 kB 🏆-33% 86.81 kB 67x 5,683 ms
terser -52% 267.99 kB -33% 87.66 kB 48x 4,118 ms
swc -52% 266.13 kB -32% 87.93 kB 5x 453 ms
uglify-js.no-compress -50% 275.35 kB -32% 88.30 kB 11x 986 ms
terser.no-compress -50% 276.47 kB -32% 88.99 kB 21x 1,843 ms
tdewolff-minify -51% 269.93 kB -31% 89.70 kB 🏆 84 ms
esbuild -51% 270.18 kB -30% 90.42 kB 1x 122 ms
google-closure-compiler -51% 270.30 kB -28% 93.48 kB 91x 7,752 ms
babel-minify Failed to minify

Artifact Original size Gzip size
terser v5.15.0 (Source) 958.35 kB 183.30 kB
Minifier Minified size Minzipped size Time
uglify-js -55% 433.57 kB 🏆-36% 118.14 kB 94x 5,357 ms
terser -54% 439.37 kB -35% 118.27 kB 65x 3,752 ms
terser.no-compress -53% 454.26 kB -35% 119.13 kB 28x 1,610 ms
uglify-js.no-compress -53% 452.01 kB -35% 119.23 kB 17x 969 ms
tdewolff-minify -54% 437.66 kB -35% 119.48 kB 🏆 57 ms
google-closure-compiler 🏆-56% 421.60 kB -34% 120.55 kB 128x 7,302 ms
esbuild -54% 439.94 kB -34% 120.94 kB 1x 86 ms
swc -49% 484.91 kB -32% 123.86 kB 5x 321 ms
babel-minify Failed to minify

Artifact Original size Gzip size
three v0.124.0 (Source) 1.25 MB 247.75 kB
Minifier Minified size Minzipped size Time
uglify-js 🏆-49% 642.25 kB 🏆-36% 158.26 kB 89x 7,253 ms
terser -48% 653.38 kB -36% 158.57 kB 68x 5,532 ms
swc -48% 644.46 kB -36% 158.94 kB 7x 576 ms
google-closure-compiler -48% 644.45 kB -35% 161.84 kB 118x 9,599 ms
uglify-js.no-compress -46% 674.49 kB -35% 162.17 kB 17x 1,423 ms
terser.no-compress -46% 675.60 kB -34% 162.35 kB 29x 2,393 ms
esbuild -48% 646.78 kB -34% 162.65 kB 1x 154 ms
tdewolff-minify -48% 644.89 kB -34% 163.91 kB 🏆 81 ms
babel-minify Timed out

Artifact Original size Gzip size
victory v35.8.4 (Source) 2.14 MB 309.06 kB
Minifier Minified size Minzipped size Time
uglify-js 🏆-67% 702.71 kB 🏆-49% 157.54 kB 81x 8,955 ms
terser -66% 715.74 kB -49% 158.16 kB 72x 7,935 ms
swc -67% 711.96 kB -48% 160.18 kB 6x 736 ms
tdewolff-minify -66% 718.74 kB -47% 164.50 kB 🏆 109 ms
terser.no-compress -64% 759.34 kB -46% 165.72 kB 26x 2,939 ms
uglify-js.no-compress -65% 756.53 kB -46% 166.88 kB 16x 1,828 ms
google-closure-compiler -67% 705.87 kB -44% 174.20 kB 93x 10,200 ms
esbuild -66% 724.21 kB -42% 179.78 kB 1x 195 ms
babel-minify Failed to minify

Artifact Original size Gzip size
echarts v5.1.1 (Source) 3.20 MB 683.47 kB
Minifier Minified size Minzipped size Time
terser -69% 1.00 MB 🏆-53% 321.26 kB 41x 12,478 ms
swc -69% 1.00 MB -53% 323.09 kB 7x 2,168 ms
uglify-js 🏆-69% 980.32 kB -52% 326.24 kB 50x 15,110 ms
terser.no-compress -66% 1.07 MB -52% 329.73 kB 19x 5,721 ms
uglify-js.no-compress -67% 1.07 MB -52% 330.46 kB 7x 2,297 ms
esbuild -68% 1.01 MB -52% 330.87 kB 1x 337 ms
tdewolff-minify -68% 1.01 MB -52% 331.30 kB 🏆 301 ms
babel-minify Timed out
google-closure-compiler Timed out

Artifact Original size Gzip size
antd v4.16.1 (Source) 6.69 MB 825.74 kB
Minifier Minified size Minzipped size Time
uglify-js 🏆-67% 2.23 MB 🏆-45% 454.67 kB 41x 15,216 ms
terser -66% 2.25 MB -44% 458.50 kB 39x 14,434 ms
swc -66% 2.25 MB -44% 460.34 kB 5x 2,185 ms
tdewolff-minify -66% 2.30 MB -43% 473.23 kB 🏆 368 ms
terser.no-compress -64% 2.43 MB -42% 476.68 kB 19x 7,121 ms
uglify-js.no-compress -64% 2.42 MB -42% 479.73 kB 8x 3,250 ms
esbuild -66% 2.31 MB -41% 488.10 kB 1x 525 ms
babel-minify Timed out
google-closure-compiler Timed out

Artifact Original size Gzip size
typescript v4.6.4 (Source) 10.09 MB 1.77 MB
Minifier Minified size Minzipped size Time
uglify-js.no-compress -67% 3.33 MB 🏆-53% 828.15 kB 8x 6,698 ms
tdewolff-minify 🏆-69% 3.17 MB -53% 829.76 kB 1x 942 ms
terser.no-compress -67% 3.32 MB -53% 831.17 kB 15x 11,665 ms
esbuild -67% 3.28 MB -51% 863.80 kB 🏆 768 ms
babel-minify Timed out
google-closure-compiler Timed out
swc Invalid output: TypeError
terser Timed out
uglify-js 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.