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! β€οΈ
- 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
- 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)
Minifiers are ranked by smallest minzipped size.
Size of the minified output.
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.
How long minification took (average of 5 runs). Each time is annotated with a multiplier relative to the fastest minifier.
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.
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+.
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.