Choose a version:
50% The original file has 811489 bytes (792.5k) and is available from the project website.
There you can find the official minified version, too, which brings down the size to 406501 bytes (397.0k, 50%).

After GZIP compression these minified files vary in size:
Boot
  116671 bytes (113.9k)
CDN
cdnjs
  97579 bytes (95.3k)
CDN
unpkg
  97482 bytes (95.2k)
CDN
gzip -6 (default)
  96676 bytes (94.4k)
local copy
gzip -9
  96226 bytes (94.0k)
local copy
libdeflate -12
  92956 bytes (90.8k)
local copy
7zip -mx=9 -tgzip
  92844 bytes (90.7k)
local copy
zultra
  92775 bytes (90.6k)
local copy
pigz -11 -n
  92539 bytes (90.4k)
local copy
kzip -s0 -rn -b0
  92509 bytes (90.3k)
local copy
Zopfli
  92434 bytes (90.3k)
local copy
Zopfli (defluff)
  92432 bytes (90.3k)
local copy

perma-link to the smallest file on my server:
http://minime.stephan-brumme.com/files/threejs/three-r55.min.js (or via HTTPS)

You will automatically get the smallest ThreeJS 55 file, ETag caching is available and
if your browser doesn't support GZIP decompression then the uncompressed version will be sent.

Currently best Zopfli settings

Save 5048 bytes by using my ThreeJS 55 Zopfli version instead of the best available CDN (5.46% smaller than unpkg, 92434 vs. 97482 bytes):
You can use my super-compressed files for whatever purpose you like as long as you respect the library's original license agreement.
There are no restrictions from my side - but please avoid hot-linking if you run a high-traffic website.

These command-line settings yielded the best compression ratio so far (Linux version of zopfli-krzymod):
zopfli --i1000000 --mb8 --mls8192 --bsr40 --lazy --ohh

(found February 15, 2017)
Description Value Parameter
iterations 1000000  --i1000000
maximum blocks 8  --mb8
maximum length score 8192  --mls8192
block splitting recursion 40  --bsr40
lazy matching in LZ77 yes  --lazy
optimized Huffman headers yes  --ohh
initial random W for iterations 1  --rw1
initial random Z for iterations 2  --rz2

Even Smaller Files Thanks To Defluff

Zopfli's output can be further optimized by the defluff tool.
In this particular case, defluff saves 2 more bytes (92432 bytes).

Verify file integrity

After decompression, my uncompressed files are identical to the original ones:

MD5:
curl --silent --compressed https://raw.githubusercontent.com/mrdoob/three.js/r55/build/three.min.js --location | md5sum
88c901236e53d75f0096a18cda2a636d  -
curl --silent --compressed https://minime.stephan-brumme.com/files/threejs/three-r55.min.zopfli.js.gz | md5sum
88c901236e53d75f0096a18cda2a636d  -

SHA1:
curl --silent --compressed https://raw.githubusercontent.com/mrdoob/three.js/r55/build/three.min.js --location | sha1sum
adb175114ab3094a732d479659121fd1a1c18c4c  -
curl --silent --compressed https://minime.stephan-brumme.com/files/threejs/three-r55.min.zopfli.js.gz | sha1sum
adb175114ab3094a732d479659121fd1a1c18c4c  -

These CDNs send you the original file:
CDN Size (compressed) MD5 (uncompressed) Timestamp
Boot 116671 bytes 88c901236e53d75f0096a18cda2a636d (invalid)
cdnjs 97579 bytes 88c901236e53d75f0096a18cda2a636d (invalid)

And some CDNs send you a different file:
CDN Size (compressed) MD5 (uncompressed) Comment / Diff Timestamp
unpkg 97482 bytes 0459d8bcc009f9ef4b6169aeff118969 >
> var window = window || {};
> var self = self || {};
< f=this.w,g=f*a.w+c*a.x+d*a.y+e*a.z;0>g?(this.w=-a.w,this.x [...]
> f=this.w,g=f*a.w+c*a.x+d*a.y+e*a.z;0>g?(this.w=-a.w,this.x [...]
< Math.abs(d+g)&&0.1>Math.abs(f+c)&&0.1>Math.abs(h+b)&&0.1>M [...]
< c)/a;this.z=(g-d)/a;this.w=Math.acos((e+i+k-1)/2);return t [...]
> Math.abs(d+g)&&0.1>Math.abs(f+c)&&0.1>Math.abs(h+b)&&0.1>M [...]
> (f-c)/a;this.z=(g-d)/a;this.w=Math.acos((e+i+k-1)/2);retur [...]
< THREE.Clock.prototype.getDelta=function(){var a=0;this.aut [...]
[...]
July 11, 2016 @ 15:49

Note: only the MD5 hashes are shown to keep things simple.

Other Versions

Available ThreeJS versions at minime.stephan-brumme.com:

148, 147, 146, 145, 144, 143, 142, 141, 140, 139, 138, 137, 136, 135, 134, 133, 132, 131, 130, 129, 128, 127, 126, 125, 124, 123, 122, 121, 120, 119, 118, 117, 116, 115, 114, 113, 112, 111, 110, 109, 108, 107, 106, 105, 104, 103, 102, 101, 100, 99, 98, 97, 96, 95, 94, 93, 92, 91, 90, 89, 88, 87, 86, 85, 84, 83, 82, 81, 80, 79, 78, 77, 76, 75, 74, 73, 72, 71, 70, 69, 68, 67, 66, 65, 64, 63, 62, 61, 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, 50

The project site contains an overview how well these versions were compressed.
Other interesting projects are AngularJS, BackboneJS, Bootstrap, D3, Dojo, Ember, jQuery, Knockout, lodash, React, Socket.IO, UnderscoreJS and Vue.

Changelog

Best Zopfli parameters so far:
Size Improvement Parameters Found
92434 bytes -2 bytes zopfli --i1000000 --mls8192 --bsr40 --lazy --ohh February 15, 2017 @ 09:39
92436 bytes -1 byte zopfli --i100000 --mls8192 --bsr40 --lazy --ohh December 28, 2015 @ 19:52
92437 bytes -6 bytes zopfli --i100000 --mls4096 --bsr7 --lazy --ohh December 28, 2015 @ 17:06
92443 bytes -11 bytes zopfli --i10000 --mls4096 --bsr7 --lazy --ohh November 16, 2015 @ 10:18
92454 bytes -5 bytes zopfli --i1000 --mls4096 --bsr7 --lazy --ohh November 16, 2015 @ 06:53
92459 bytes -1 byte zopfli --i1000 --mls2048 --bsr7 --lazy --ohh November 16, 2015 @ 06:40
92460 bytes -1 byte zopfli --i1000 --mls8192 --bsr40 --lazy --ohh November 16, 2015 @ 06:34
92461 bytes -12 bytes zopfli --i1000 --mls4096 --bsr25 --lazy --ohh November 16, 2015 @ 06:33
92473 bytes -7 bytes zopfli --i1000 --mls16384 --bsr6 --lazy --ohh November 16, 2015 @ 06:23
92480 bytes -1 byte zopfli --i1000 --mls2048 --bsr22 --lazy --ohh November 16, 2015 @ 06:17
92481 bytes zopfli --i100 --mls8192 --bsr40 --lazy --ohh November 15, 2015 @ 12:21

If there are multiple parameter sets yielding the same compressed size, only the first one found is shown.

Most recent activity on July 20, 2020 @ 12:51.

Heatmaps

This Zopfli heatmap visualizes how compression changes when modifying the --bsr and --mls parameter.
Cell's contents is the best filesize achieved (in bytes, hover with mouse over cells to see number of iterations).

Good parameters are green, bad are red. The best and worst are bold as well.
The brightness of the blue background color indicates how many iterations were processed:
10,000, 100,000 or 1,000,000.
bsr \ mls
2 4 8 16 32 64 128 256 512 1024 2048 4096 8192 16384 32768
bsr \ mls
2 4 8 16 32 64 128 256 512 1024 2048 4096 8192 16384 32768
92688 92688 92673 92619 92609 92608 92585 92584 92592 92600 92608 92598 92613 92609 92733
92686 92587 92584 92696 92573 92567 92573 92520 92464 92489 92568 92686 92688 92704 92707
92670 92669 92558 92670 92675 92569 92570 92544 92541 92559 92556 92711 92580 92459 92703
92579 92560 92563 92567 92561 92565 92565 92534 92535 92535 92449 92437 92572 92596 92588
92563 92558 92556 92549 92560 92565 92563 92524 92464 92556 92597 92567 92590 92541 92596
92557 92563 92564 92558 92557 92557 92562 92526 92533 92604 92577 92565 92547 92535 92701
92567 92667 92556 92562 92573 92674 92576 92529 92520 92569 92565 92564 92542 92575 92708
92664 92559 92565 92661 92556 92663 92572 92517 92522 92561 92549 92590 92576 92568 92682
92563 92561 92565 92553 92551 92679 92673 92518 92454 92528 92525 92452 92475 92596 92712
92560 92555 92565 92560 92558 92563 92678 92517 92522 92523 92512 92586 92570 92439 92679
92562 92558 92553 92562 92562 92675 92677 92531 92572 92449 92549 92533 92536 92539 92608
92575 92556 92556 92558 92554 92568 92566 92522 92533 92529 92533 92534 92577 92450 92587
92576 92573 92611 92558 92560 92564 92563 92526 92530 92460 92538 92530 92577 92451 92683
92560 92557 92560 92556 92561 92567 92562 92520 92520 92551 92550 92565 92578 92540 92584
92557 92555 92559 92554 92556 92563 92563 92524 92523 92517 92512 92580 92463 92453 92573
92559 92558 92555 92553 92566 92565 92564 92520 92524 92571 92514 92546 92557 92534 92699
92558 92564 92555 92556 92670 92679 92670 92519 92534 92464 92521 92564 92466 92568 92703
92560 92557 92560 92668 92679 92678 92563 92513 92525 92516 92514 92529 92561 92452 92699
92687 92560 92664 92558 92666 92672 92671 92519 92533 92466 92459 92575 92456 92568 92711
92563 92558 92561 92559 92678 92672 92669 92524 92520 92557 92560 92566 92564 92595 92695
92561 92553 92558 92556 92569 92680 92669 92524 92529 92521 92553 92440 92464 92573 92701
92562 92555 92554 92556 92560 92566 92567 92526 92516 92555 92552 92564 92456 92534 92703
92563 92556 92668 92669 92558 92569 92564 92521 92534 92540 92534 92562 92434 92531 92709

Due to the Monte Carlo design of my search algorithm, not all parameters have reached the same number of iterations yet:
Iterations Min. Bytes Reduction Coverage
100 92481 bytes 100%
1,000 92454 bytes -27 bytes 100%
10,000 92443 bytes -11 bytes 100%
100,000 92436 bytes -7 bytes 1.16%
1,000,000 92434 bytes -2 bytes 0.29%
10,000,000

KZIP has far less options available for tuning/optimization. I only played around with the number of blocks (parameter -n):
Blocks Min. Bytes Compared To Best Zopfli Compared To Best KZIP
92509 bytes +75 bytes (+0.08%)
93025 bytes +591 bytes (+0.64%) +516 bytes
92874 bytes +440 bytes (+0.48%) +365 bytes
92879 bytes +445 bytes (+0.48%) +370 bytes
92753 bytes +319 bytes (+0.35%) +244 bytes
92711 bytes +277 bytes (+0.30%) +202 bytes
92657 bytes +223 bytes (+0.24%) +148 bytes
92654 bytes +220 bytes (+0.24%) +145 bytes
92595 bytes +161 bytes (+0.17%) +86 bytes

Non-DEFLATE Algorithms

Archivers based on completely different compression algorithms often produce superior results.
Unfortunately, browsers only support gzip compression at the moment.
However, support for Brotli is constantly growing - but your browser doesn't support it.
Algorithm Program Parameters Size Compared To Best Zopfli
ZPAQ (Wikipedia) zpaq zpaq -method 69 63230 bytes -29204 bytes (-31.59%)
RAR (proprietary) RAR rar a -m5 -md64m -mc63:128t -mt1 73204 bytes -19230 bytes (-20.80%)
PPMd (Wikipedia) 7zip 7za a -mx=9 -m0=ppmd 78062 bytes -14372 bytes (-15.55%)
Brotli (Wikipedia) brotli brotli -q 11 78492 bytes -13942 bytes (-15.08%)
LZMA2 (Wikipedia) xz xz -9 79000 bytes -13434 bytes (-14.53%)
Zstandard (Wikipedia) zstd zstd -19 84396 bytes -8038 bytes (-8.70%)
Burrows-Wheeler transform (Wikipedia) bzip2 bzip2 -9 85449 bytes -6985 bytes (-7.56%)

Detailled Analysis

I wrote a DEFLATE decoder in Javascript. Click the button below to start a client-side analysis of the smallest gzipped files (may take a second):


Notes: pigz is a fast open source multi-threaded implementation of gzip written by one of the original authors of gzip.
However, when using compression level 11, pigz actually switches to the slower Zopfli algorithm and isn't multi-threaded anymore.
KrzyMOD's extensions to Zopfli offer the highest level of configuration and is therefore used for my brute-force search.
Ken Silverman wrote the closed-source KZIP compression program and Jonathon Fowler ported it to Linux.
Defluff was created by Joachim Henke; DeflOpt is a tool by Ben Jos Walbeehm.

website made by Stephan Brumme in 2015 and still improving in 2024.
all timestamps are displayed in central european time. see my changelog.
no flash, not even images or external css files - and everything squeezed into a single html file.
which was handsomely compressed before releasing it into the wild internet - obviously.

please visit my homepage and my blog, too.
email: minime (at) stephan-brumme.com

All trademarks are property of their respective owners. You know, the boring legal stuff.