πββοΈπββοΈπ JS minification benchmarks
This repo is routinely maintained to compare the quality and speed across the latest versions of the following JavaScript minifiers:
- babel-minify
- bun
- esbuild
- google-closure-compiler
- JShrink
- minify-js
- swc
- tdewolff/minify
- terser
- uglify-js
Benchmarks last updated on Dec 2, 2023.
πββοΈ 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 |
792x 3,071 ms |
swc | -68% 22.87 kB |
-58% 8.18 kB |
5x 21 ms |
uglify-js | π-69% 22.67 kB |
-58% 8.19 kB |
135x 525 ms |
terser | -68% 23.14 kB |
-57% 8.32 kB |
69x 270 ms |
babel-minify | -67% 23.60 kB |
-57% 8.43 kB |
229x 890 ms |
esbuild | -67% 23.70 kB |
-56% 8.53 kB |
5x 20 ms |
bun | -67% 23.98 kB |
-56% 8.58 kB |
5x 21 ms |
uglify-js.no-compress | -65% 25.03 kB |
-55% 8.65 kB |
24x 96 ms |
terser.no-compress | -65% 25.08 kB |
-55% 8.72 kB |
32x 125 ms |
minify-js | -67% 23.46 kB |
-54% 9.00 kB |
π 4 ms |
jshrink | -43% 40.82 kB |
-43% 11.00 kB |
30x 118 ms |
tdewolff-minify Invalid output: SyntaxError | β | β | β |
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.87 kB |
π-49% 18.46 kB |
226x 1,220 ms |
swc | -67% 58.23 kB |
-49% 18.57 kB |
10x 56 ms |
terser | -66% 59.16 kB |
-49% 18.59 kB |
130x 699 ms |
google-closure-compiler | -66% 58.27 kB |
-48% 18.75 kB |
672x 3,615 ms |
babel-minify | -66% 59.70 kB |
-47% 19.02 kB |
323x 1,739 ms |
esbuild | -66% 59.82 kB |
-47% 19.24 kB |
4x 25 ms |
tdewolff-minify | -66% 59.95 kB |
-46% 19.42 kB |
π 5 ms |
uglify-js.no-compress | -64% 62.50 kB |
-46% 19.44 kB |
41x 222 ms |
terser.no-compress | -64% 63.15 kB |
-46% 19.56 kB |
55x 298 ms |
bun | -64% 61.79 kB |
-46% 19.69 kB |
3x 21 ms |
minify-js | -65% 60.74 kB |
-42% 20.82 kB |
2x 12 ms |
jshrink | -44% 97.63 kB |
-31% 24.80 kB |
49x 268 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.54 kB |
π-63% 30.85 kB |
191x 1,747 ms |
swc | -69% 89.16 kB |
-63% 30.86 kB |
10x 96 ms |
terser | -69% 89.54 kB |
-63% 30.90 kB |
108x 992 ms |
tdewolff-minify | -69% 89.85 kB |
-63% 31.44 kB |
π 9 ms |
uglify-js.no-compress | -67% 94.08 kB |
-63% 31.44 kB |
34x 314 ms |
terser.no-compress | -67% 94.55 kB |
-63% 31.59 kB |
44x 407 ms |
babel-minify | -68% 92.10 kB |
-62% 31.75 kB |
302x 2,756 ms |
esbuild | -69% 90.07 kB |
-62% 31.89 kB |
5x 47 ms |
bun | -68% 92.41 kB |
-62% 32.43 kB |
3x 34 ms |
google-closure-compiler | -68% 92.70 kB |
-61% 32.98 kB |
438x 3,993 ms |
minify-js | -69% 90.51 kB |
-61% 33.20 kB |
2x 21 ms |
jshrink | -50% 144.14 kB |
-52% 40.64 kB |
38x 351 ms |
Artifact | Original size | Gzip size | |
---|---|---|---|
vue v2.6.12 (Source) | 342.15 kB |
89.52 kB |
|
Minifier | Minified size | Minzipped size | Time |
swc | -66% 115.46 kB |
π-53% 42.40 kB |
7x 135 ms |
terser | -66% 116.83 kB |
-52% 42.87 kB |
65x 1,231 ms |
uglify-js | π-67% 113.98 kB |
-52% 42.89 kB |
118x 2,237 ms |
babel-minify | -66% 117.90 kB |
-51% 43.83 kB |
160x 3,021 ms |
google-closure-compiler | -66% 115.60 kB |
-51% 44.05 kB |
240x 4,527 ms |
esbuild | -65% 118.14 kB |
-51% 44.24 kB |
2x 51 ms |
uglify-js.no-compress | -63% 126.14 kB |
-50% 44.36 kB |
19x 360 ms |
tdewolff-minify | -66% 117.81 kB |
-50% 44.39 kB |
π 19 ms |
terser.no-compress | -63% 126.58 kB |
-50% 44.57 kB |
26x 501 ms |
bun | -64% 121.51 kB |
-50% 44.98 kB |
2x 38 ms |
minify-js | -64% 121.77 kB |
-48% 46.72 kB |
1x 26 ms |
jshrink | -42% 197.36 kB |
-36% 56.87 kB |
24x 459 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.24 kB |
π-75% 24.56 kB |
114x 1,835 ms |
google-closure-compiler | -86% 73.47 kB |
-74% 24.84 kB |
268x 4,318 ms |
terser | -87% 70.67 kB |
-74% 25.05 kB |
66x 1,065 ms |
swc | -87% 69.83 kB |
-74% 25.05 kB |
6x 106 ms |
babel-minify | -87% 72.37 kB |
-74% 25.37 kB |
149x 2,402 ms |
uglify-js.no-compress | -86% 74.61 kB |
-73% 25.76 kB |
20x 336 ms |
esbuild | -87% 72.48 kB |
-73% 26.06 kB |
1x 32 ms |
terser.no-compress | -86% 75.67 kB |
-73% 26.10 kB |
27x 448 ms |
bun | -86% 74.07 kB |
-73% 26.30 kB |
1x 25 ms |
tdewolff-minify | -87% 71.90 kB |
-73% 26.40 kB |
π 16 ms |
jshrink | -73% 148.78 kB |
-63% 36.01 kB |
22x 355 ms |
minify-js Invalid output: SyntaxError | β | β | β |
Artifact | Original size | Gzip size | |
---|---|---|---|
d3 v6.3.1 (Source) | 555.77 kB |
129.99 kB |
|
Minifier | Minified size | Minzipped size | Time |
uglify-js | -53% 263.91 kB |
π-33% 86.73 kB |
85x 4,307 ms |
swc | -52% 265.27 kB |
-33% 86.91 kB |
5x 302 ms |
terser | -52% 267.91 kB |
-33% 87.71 kB |
55x 2,822 ms |
uglify-js.no-compress | -50% 275.35 kB |
-32% 88.30 kB |
14x 739 ms |
terser.no-compress | -50% 276.47 kB |
-32% 88.99 kB |
25x 1,304 ms |
tdewolff-minify | -51% 269.93 kB |
-31% 89.68 kB |
1x 56 ms |
esbuild | -51% 270.13 kB |
-30% 90.41 kB |
1x 81 ms |
bun | -51% 273.42 kB |
-30% 91.47 kB |
π 51 ms |
google-closure-compiler | -51% 270.30 kB |
-28% 93.48 kB |
135x 6,868 ms |
minify-js | π-53% 261.82 kB |
-26% 95.58 kB |
1x 61 ms |
babel-minify Failed to minify | β | β | β |
jshrink Invalid output: TypeError | β | β | β |
Artifact | Original size | Gzip size | |
---|---|---|---|
terser v5.24.0 (Source) | 993.16 kB |
190.42 kB |
|
Minifier | Minified size | Minzipped size | Time |
swc | -55% 449.79 kB |
π-36% 121.30 kB |
7x 248 ms |
uglify-js | -55% 446.16 kB |
-36% 121.45 kB |
120x 3,985 ms |
terser | -54% 452.57 kB |
-36% 121.68 kB |
78x 2,615 ms |
terser.no-compress | -53% 468.27 kB |
-36% 122.59 kB |
34x 1,147 ms |
uglify-js.no-compress | -53% 465.99 kB |
-36% 122.74 kB |
24x 807 ms |
tdewolff-minify | -55% 450.94 kB |
-35% 122.90 kB |
π 33 ms |
google-closure-compiler | π-56% 434.32 kB |
-35% 124.42 kB |
191x 6,338 ms |
esbuild | -54% 453.18 kB |
-35% 124.43 kB |
1x 66 ms |
bun | -54% 460.66 kB |
-34% 125.29 kB |
1x 40 ms |
jshrink | -37% 624.59 kB |
-25% 142.58 kB |
37x 1,250 ms |
babel-minify Failed to minify | β | β | β |
minify-js Invalid output: SyntaxError | β | β | β |
Artifact | Original size | Gzip size | |
---|---|---|---|
three v0.124.0 (Source) | 1.25 MB |
247.75 kB |
|
Minifier | Minified size | Minzipped size | Time |
swc | -48% 643.00 kB |
π-36% 157.66 kB |
7x 413 ms |
uglify-js | π-49% 642.22 kB |
-36% 158.26 kB |
99x 5,493 ms |
terser | -48% 654.01 kB |
-36% 158.95 kB |
68x 3,810 ms |
babel-minify | -48% 648.83 kB |
-35% 161.70 kB |
218x 12,090 ms |
google-closure-compiler | -48% 644.45 kB |
-35% 161.84 kB |
141x 7,845 ms |
uglify-js.no-compress | -46% 674.49 kB |
-35% 162.17 kB |
19x 1,104 ms |
terser.no-compress | -46% 675.60 kB |
-34% 162.35 kB |
30x 1,678 ms |
esbuild | -48% 646.76 kB |
-34% 162.65 kB |
1x 99 ms |
tdewolff-minify | -48% 644.55 kB |
-34% 163.91 kB |
2x 124 ms |
bun | -47% 662.22 kB |
-33% 164.92 kB |
π 55 ms |
minify-js | -47% 660.81 kB |
-32% 168.59 kB |
1x 100 ms |
jshrink | -24% 952.01 kB |
-22% 192.43 kB |
30x 1,676 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% 702.67 kB |
π-49% 157.52 kB |
112x 6,977 ms |
swc | -67% 707.83 kB |
-49% 157.58 kB |
9x 609 ms |
terser | -66% 715.60 kB |
-49% 158.05 kB |
85x 5,307 ms |
tdewolff-minify | -66% 718.73 kB |
-47% 164.49 kB |
π 62 ms |
terser.no-compress | -64% 759.34 kB |
-46% 165.72 kB |
34x 2,136 ms |
uglify-js.no-compress | -65% 756.53 kB |
-46% 166.88 kB |
22x 1,394 ms |
minify-js | π-72% 607.42 kB |
-46% 168.01 kB |
2x 144 ms |
google-closure-compiler | -67% 705.87 kB |
-44% 174.20 kB |
153x 9,469 ms |
esbuild | -66% 724.14 kB |
-42% 179.74 kB |
2x 142 ms |
bun | -66% 728.04 kB |
-41% 181.12 kB |
1x 79 ms |
babel-minify Failed to minify | β | β | β |
jshrink Invalid output: SyntaxError | β | β | β |
Artifact | Original size | Gzip size | |
---|---|---|---|
echarts v5.1.1 (Source) | 3.20 MB |
683.47 kB |
|
Minifier | Minified size | Minzipped size | Time |
swc | -69% 993.30 kB |
π-53% 319.69 kB |
9x 1,143 ms |
terser | -69% 1.00 MB |
-53% 321.40 kB |
69x 8,650 ms |
uglify-js | π-69% 980.14 kB |
-52% 326.17 kB |
98x 12,162 ms |
google-closure-compiler | -69% 990.88 kB |
-52% 327.02 kB |
104x 12,876 ms |
terser.no-compress | -66% 1.07 MB |
-52% 329.73 kB |
32x 3,990 ms |
uglify-js.no-compress | -67% 1.07 MB |
-52% 330.46 kB |
16x 1,995 ms |
esbuild | -68% 1.01 MB |
-52% 330.68 kB |
1x 240 ms |
tdewolff-minify | -68% 1.01 MB |
-52% 331.33 kB |
3x 494 ms |
bun | -68% 1.03 MB |
-51% 335.42 kB |
π 124 ms |
minify-js | -69% 1.01 MB |
-50% 340.93 kB |
1x 233 ms |
babel-minify Timed out | β | β | β |
jshrink Invalid output: TypeError | β | β | β |
Artifact | Original size | Gzip size | |
---|---|---|---|
antd v4.16.1 (Source) | 6.69 MB |
825.74 kB |
|
Minifier | Minified size | Minzipped size | Time |
swc | π-68% 2.15 MB |
π-45% 453.40 kB |
8x 1,420 ms |
uglify-js | -67% 2.23 MB |
-45% 454.61 kB |
76x 12,314 ms |
terser | -66% 2.25 MB |
-44% 458.47 kB |
61x 9,832 ms |
tdewolff-minify | -66% 2.30 MB |
-43% 473.18 kB |
1x 282 ms |
terser.no-compress | -64% 2.43 MB |
-42% 476.68 kB |
27x 4,433 ms |
uglify-js.no-compress | -64% 2.42 MB |
-42% 479.73 kB |
17x 2,742 ms |
esbuild | -66% 2.31 MB |
-41% 488.09 kB |
2x 343 ms |
bun | -66% 2.30 MB |
-41% 490.83 kB |
π 160 ms |
jshrink | -33% 4.45 MB |
-24% 625.76 kB |
43x 7,003 ms |
babel-minify Timed out | β | β | β |
google-closure-compiler Timed out | β | β | β |
minify-js Invalid output: TypeError | β | β | β |
Artifact | Original size | Gzip size | |
---|---|---|---|
typescript v5.2.2 (Source) | 8.33 MB |
1.42 MB |
|
Minifier | Minified size | Minzipped size | Time |
swc | π-65% 2.94 MB |
π-42% 825.86 kB |
12x 3,257 ms |
tdewolff-minify | -64% 3.02 MB |
-40% 848.30 kB |
1x 401 ms |
terser.no-compress | -62% 3.16 MB |
-40% 849.70 kB |
45x 11,736 ms |
uglify-js.no-compress | -62% 3.15 MB |
-40% 856.39 kB |
23x 6,162 ms |
esbuild | -63% 3.07 MB |
-38% 877.98 kB |
2x 523 ms |
bun | -62% 3.12 MB |
-37% 886.47 kB |
π 260 ms |
babel-minify Timed out | β | β | β |
google-closure-compiler Timed out | β | β | β |
jshrink Invalid output: TypeError | β | β | β |
minify-js Failed to minify | β | β | β |
terser Timed out | β | β | β |
uglify-js Timed out | β | β | β |