🏃♂️🏃♀️🏃 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 May 7, 2022.
Support this project by ⭐️ starring and sharing it. Follow me to see what other cool projects I'm working on! ❤️
🙋♂️ Why?
- To help you pick a minifier that fits your needs
- To promote JS minifiers and document their performances
- 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 |
303x 3,527 ms |
uglify-js | 🏆-68% 22.75 kB |
-58% 8.22 kB |
59x 696 ms |
swc | -68% 22.98 kB |
-57% 8.27 kB |
2x 24 ms |
terser | -68% 23.12 kB |
-57% 8.29 kB |
28x 336 ms |
babel-minify | -67% 23.60 kB |
-57% 8.43 kB |
80x 939 ms |
esbuild | -67% 23.70 kB |
-56% 8.53 kB |
1x 18 ms |
uglify-js.no-compress | -65% 25.03 kB |
-55% 8.65 kB |
10x 125 ms |
tdewolff-minify | -67% 23.61 kB |
-55% 8.69 kB |
🏆 12 ms |
terser.no-compress | -65% 25.08 kB |
-55% 8.72 kB |
13x 152 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.96 kB |
🏆-49% 18.44 kB |
112x 1,649 ms |
terser | -66% 59.06 kB |
-49% 18.53 kB |
62x 917 ms |
google-closure-compiler | -66% 58.27 kB |
-48% 18.75 kB |
291x 4,288 ms |
swc | -66% 58.77 kB |
-48% 18.87 kB |
4x 60 ms |
babel-minify | -66% 59.70 kB |
-47% 19.02 kB |
155x 2,289 ms |
esbuild | -66% 59.83 kB |
-47% 19.25 kB |
1x 27 ms |
uglify-js.no-compress | -64% 62.50 kB |
-46% 19.44 kB |
21x 318 ms |
terser.no-compress | -64% 63.15 kB |
-46% 19.56 kB |
24x 361 ms |
tdewolff-minify | -66% 59.95 kB |
-46% 19.62 kB |
🏆 15 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.60 kB |
🏆-63% 30.87 kB |
101x 2,433 ms |
terser | -69% 89.88 kB |
-63% 30.93 kB |
51x 1,248 ms |
uglify-js.no-compress | -67% 94.08 kB |
-63% 31.44 kB |
18x 445 ms |
terser.no-compress | -67% 94.55 kB |
-63% 31.59 kB |
20x 493 ms |
babel-minify | -68% 92.10 kB |
-62% 31.75 kB |
146x 3,532 ms |
swc | -69% 89.38 kB |
-62% 31.84 kB |
4x 114 ms |
esbuild | -69% 90.07 kB |
-62% 31.89 kB |
1x 38 ms |
tdewolff-minify | -69% 89.91 kB |
-62% 31.98 kB |
🏆 24 ms |
google-closure-compiler | -68% 92.70 kB |
-61% 32.98 kB |
198x 4,770 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 |
52x 1,559 ms |
uglify-js | 🏆-67% 114.21 kB |
-52% 42.90 kB |
106x 3,139 ms |
babel-minify | -66% 117.90 kB |
-51% 43.83 kB |
139x 4,122 ms |
swc | -65% 118.14 kB |
-51% 44.01 kB |
5x 151 ms |
google-closure-compiler | -66% 115.60 kB |
-51% 44.05 kB |
194x 5,736 ms |
esbuild | -65% 118.16 kB |
-51% 44.25 kB |
1x 47 ms |
uglify-js.no-compress | -63% 126.14 kB |
-50% 44.36 kB |
17x 509 ms |
terser.no-compress | -63% 126.58 kB |
-50% 44.57 kB |
21x 625 ms |
tdewolff-minify | -65% 118.15 kB |
-50% 44.79 kB |
🏆 30 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.60 kB |
🏆-74% 24.61 kB |
86x 2,590 ms |
google-closure-compiler | -86% 73.47 kB |
-74% 24.84 kB |
178x 5,361 ms |
terser | -87% 71.09 kB |
-74% 25.06 kB |
46x 1,398 ms |
babel-minify | -87% 72.37 kB |
-74% 25.37 kB |
108x 3,272 ms |
swc | -87% 70.00 kB |
-74% 25.47 kB |
4x 133 ms |
uglify-js.no-compress | -86% 74.61 kB |
-73% 25.76 kB |
16x 485 ms |
esbuild | -87% 72.49 kB |
-73% 26.06 kB |
1x 57 ms |
terser.no-compress | -86% 75.67 kB |
-73% 26.10 kB |
18x 544 ms |
tdewolff-minify | -87% 72.44 kB |
-72% 26.75 kB |
🏆 30 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.38 kB |
🏆-33% 86.84 kB |
102x 5,805 ms |
terser | -52% 267.99 kB |
-33% 87.66 kB |
56x 3,205 ms |
uglify-js.no-compress | -50% 275.35 kB |
-32% 88.30 kB |
16x 953 ms |
swc | -52% 266.71 kB |
-32% 88.81 kB |
8x 496 ms |
terser.no-compress | -50% 276.47 kB |
-32% 88.99 kB |
23x 1,310 ms |
esbuild | -51% 270.18 kB |
-30% 90.42 kB |
1x 82 ms |
tdewolff-minify | -51% 269.95 kB |
-30% 90.70 kB |
🏆 57 ms |
google-closure-compiler | -51% 270.30 kB |
-28% 93.48 kB |
130x 7,408 ms |
babel-minify Failed to minify | — | — | — |
Artifact | Original size | Gzip size | |
---|---|---|---|
terser v5.13.1 (Source) | 952.33 kB |
182.00 kB |
|
Minifier | Minified size | Minzipped size | Time |
terser | -54% 437.16 kB |
🏆-35% 117.58 kB |
43x 2,806 ms |
uglify-js | -55% 432.13 kB |
-35% 117.61 kB |
77x 5,006 ms |
terser.no-compress | -53% 451.95 kB |
-35% 118.51 kB |
18x 1,199 ms |
uglify-js.no-compress | -53% 449.73 kB |
-35% 118.59 kB |
15x 1,019 ms |
tdewolff-minify | -54% 435.60 kB |
-34% 119.56 kB |
🏆 64 ms |
google-closure-compiler | 🏆-56% 419.42 kB |
-34% 119.87 kB |
105x 6,760 ms |
esbuild | -54% 437.76 kB |
-34% 120.30 kB |
1x 95 ms |
swc | -47% 509.15 kB |
-30% 127.81 kB |
9x 620 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 | 🏆-48% 642.78 kB |
🏆-36% 158.27 kB |
108x 9,093 ms |
terser | -48% 653.38 kB |
-36% 158.57 kB |
46x 3,871 ms |
swc | -48% 648.92 kB |
-35% 160.76 kB |
7x 604 ms |
babel-minify | -48% 648.83 kB |
-35% 161.70 kB |
169x 14,247 ms |
google-closure-compiler | -48% 644.45 kB |
-35% 161.84 kB |
131x 10,995 ms |
uglify-js.no-compress | -46% 674.49 kB |
-35% 162.17 kB |
16x 1,403 ms |
terser.no-compress | -46% 675.60 kB |
-34% 162.35 kB |
19x 1,660 ms |
esbuild | -48% 646.78 kB |
-34% 162.65 kB |
2x 206 ms |
tdewolff-minify | -48% 648.01 kB |
-33% 165.05 kB |
🏆 84 ms |
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% 704.12 kB |
🏆-49% 157.61 kB |
83x 9,020 ms |
terser | -66% 715.74 kB |
-49% 158.16 kB |
50x 5,468 ms |
swc | -67% 712.84 kB |
-47% 164.18 kB |
9x 989 ms |
terser.no-compress | -64% 759.34 kB |
-46% 165.72 kB |
20x 2,218 ms |
uglify-js.no-compress | -65% 756.53 kB |
-46% 166.88 kB |
17x 1,926 ms |
tdewolff-minify | -66% 719.30 kB |
-45% 170.41 kB |
🏆 108 ms |
google-closure-compiler | -67% 705.87 kB |
-44% 174.20 kB |
141x 15,293 ms |
esbuild | -66% 724.21 kB |
-42% 179.79 kB |
2x 300 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 |
43x 8,153 ms |
uglify-js | 🏆-69% 981.52 kB |
-52% 326.38 kB |
82x 15,644 ms |
swc | -69% 1.00 MB |
-52% 326.64 kB |
11x 2,139 ms |
terser.no-compress | -66% 1.07 MB |
-52% 329.73 kB |
19x 3,775 ms |
uglify-js.no-compress | -67% 1.07 MB |
-52% 330.46 kB |
12x 2,393 ms |
esbuild | -68% 1.01 MB |
-52% 330.87 kB |
1x 364 ms |
tdewolff-minify | -68% 1.01 MB |
-51% 336.42 kB |
🏆 189 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.80 kB |
63x 15,397 ms |
terser | -66% 2.25 MB |
-44% 458.50 kB |
37x 9,005 ms |
swc | -66% 2.25 MB |
-44% 464.23 kB |
11x 2,660 ms |
terser.no-compress | -64% 2.43 MB |
-42% 476.68 kB |
16x 4,072 ms |
uglify-js.no-compress | -64% 2.42 MB |
-42% 479.73 kB |
14x 3,586 ms |
tdewolff-minify | -66% 2.30 MB |
-41% 483.92 kB |
🏆 241 ms |
esbuild | -66% 2.31 MB |
-41% 488.11 kB |
2x 593 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 |
9x 7,153 ms |
terser.no-compress | -67% 3.32 MB |
-53% 831.17 kB |
10x 8,364 ms |
tdewolff-minify | 🏆-69% 3.18 MB |
-53% 837.72 kB |
1x 926 ms |
esbuild | -67% 3.28 MB |
-51% 863.80 kB |
🏆 790 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.