Choose a version:
49% The original file has 796479 bytes (777.8k) and is available from the project website.
There you can find the official minified version, too, which brings down the size to 391407 bytes (382.2k, 49%).

After GZIP compression these minified files vary in size:
Boot
  115580 bytes (112.9k)
CDN
cdnjs
  97288 bytes (95.0k)
CDN
gzip -6 (default)
  96247 bytes (94.0k)
local copy
gzip -9
  95843 bytes (93.6k)
local copy
libdeflate -12
  92997 bytes (90.8k)
local copy
zultra
  92818 bytes (90.6k)
local copy
7zip -mx=9 -tgzip
  92817 bytes (90.6k)
local copy
pigz -11 -n
  92604 bytes (90.4k)
local copy
kzip -s0 -rn -b8
  92542 bytes (90.4k)
local copy
Zopfli
  92469 bytes (90.3k)
local copy
Zopfli (defluff)
  92465 bytes (90.3k)
local copy

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

You will automatically get the smallest ThreeJS 50 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 4819 bytes by using my ThreeJS 50 Zopfli version instead of the best available CDN (5.21% smaller than cdnjs, 92469 vs. 97288 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 --mls16384 --bsr7 --lazy --ohh

(found February 17, 2017)
Description Value Parameter
iterations 1000000  --i1000000
maximum blocks 8  --mb8
maximum length score 16384  --mls16384
block splitting recursion 7  --bsr7
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 4 more bytes (92465 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/r50/build/three.min.js --location | md5sum
ff5e4c648720dd1f7d31e8c1bdffe6c7  -
curl --silent --compressed https://minime.stephan-brumme.com/files/threejs/three-r50.min.zopfli.js.gz | md5sum
ff5e4c648720dd1f7d31e8c1bdffe6c7  -

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

All listed CDNs deliver identical contents:
CDN Size (compressed) MD5 (uncompressed) Timestamp
Boot 115580 bytes ff5e4c648720dd1f7d31e8c1bdffe6c7 (invalid)
cdnjs 97288 bytes ff5e4c648720dd1f7d31e8c1bdffe6c7 (invalid)

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
92469 bytes -3 bytes zopfli --i1000000 --mls16384 --bsr7 --lazy --ohh February 17, 2017 @ 11:15
92472 bytes -5 bytes zopfli --i100000 --mls16384 --bsr7 --lazy --ohh December 22, 2015 @ 20:02
92477 bytes -25 bytes zopfli --i10000 --mls16384 --bsr7 --lazy --ohh November 16, 2015 @ 09:30
92502 bytes -16 bytes zopfli --i1000 --mls16384 --bsr7 --lazy --ohh November 16, 2015 @ 09:15
92518 bytes zopfli --i100 --mls16384 --bsr7 --lazy --ohh November 15, 2015 @ 13:06

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:49.

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
92638 92671 92649 92596 92667 92636 92622 92595 92582 92633 92695 92696 92717 92614 92698
92568 92617 92665 92687 92621 92618 92601 92496 92599 92619 92590 92579 92592 92540 92561
92732 92631 92627 92675 92612 92636 92609 92620 92562 92571 92576 92508 92547 92535 92548
92650 92625 92583 92634 92594 92634 92613 92595 92549 92611 92556 92557 92561 92469 92544
92668 92677 92676 92664 92548 92665 92667 92618 92604 92584 92564 92570 92577 92560 92539
92624 92624 92612 92585 92609 92613 92636 92565 92548 92510 92560 92566 92585 92553 92598
92680 92653 92606 92630 92596 92590 92594 92592 92598 92606 92551 92547 92566 92496 92549
92684 92645 92630 92665 92640 92621 92609 92608 92602 92570 92583 92647 92543 92559 92611
92628 92639 92600 92630 92638 92637 92648 92615 92598 92611 92553 92551 92558 92552 92544
92639 92634 92606 92631 92613 92623 92616 92615 92592 92514 92578 92502 92511 92552 92550
92666 92640 92643 92584 92608 92646 92607 92614 92596 92608 92579 92541 92561 92577 92555
92613 92623 92543 92594 92611 92598 92613 92608 92490 92615 92502 92652 92500 92482 92539
92668 92667 92582 92630 92596 92603 92611 92539 92590 92572 92542 92551 92552 92539 92543
92622 92635 92645 92631 92599 92601 92614 92612 92596 92616 92563 92495 92559 92537 92605
92601 92602 92613 92631 92601 92601 92615 92611 92600 92615 92559 92560 92558 92568 92620
92606 92638 92600 92585 92620 92614 92615 92613 92593 92523 92550 92546 92598 92554 92603
92624 92638 92617 92633 92603 92632 92629 92617 92598 92580 92491 92562 92511 92538 92584
92632 92654 92599 92630 92612 92596 92615 92606 92593 92573 92579 92560 92556 92580 92555
92641 92637 92627 92585 92605 92584 92615 92612 92605 92622 92587 92578 92562 92570 92551
92655 92656 92649 92634 92616 92611 92590 92612 92542 92618 92556 92556 92506 92549 92576
92626 92652 92602 92631 92603 92608 92615 92614 92551 92571 92551 92546 92557 92541 92606
92642 92641 92599 92587 92602 92612 92613 92615 92611 92614 92558 92561 92554 92567 92598
92643 92651 92600 92634 92603 92639 92614 92600 92592 92616 92572 92560 92559 92568 92567

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 92518 bytes 100%
1,000 92497 bytes -21 bytes 100%
10,000 92477 bytes -20 bytes 100%
100,000 92472 bytes -5 bytes 0.58%
1,000,000 92469 bytes -3 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
92649 bytes +180 bytes (+0.19%) +107 bytes
92787 bytes +318 bytes (+0.34%) +245 bytes
92782 bytes +313 bytes (+0.34%) +240 bytes
92749 bytes +280 bytes (+0.30%) +207 bytes
92744 bytes +275 bytes (+0.30%) +202 bytes
92706 bytes +237 bytes (+0.26%) +164 bytes
92677 bytes +208 bytes (+0.22%) +135 bytes
92610 bytes +141 bytes (+0.15%) +68 bytes
92542 bytes +73 bytes (+0.08%)

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 62595 bytes -29874 bytes (-32.31%)
RAR (proprietary) RAR rar a -m5 -md64m -mc63:128t -mt1 72938 bytes -19531 bytes (-21.12%)
Brotli (Wikipedia) brotli brotli -q 11 78024 bytes -14445 bytes (-15.62%)
LZMA2 (Wikipedia) xz xz -9 78356 bytes -14113 bytes (-15.26%)
PPMd (Wikipedia) 7zip 7za a -mx=9 -m0=ppmd 78776 bytes -13693 bytes (-14.81%)
Zstandard (Wikipedia) zstd zstd -19 83716 bytes -8753 bytes (-9.47%)
Burrows-Wheeler transform (Wikipedia) bzip2 bzip2 -9 84841 bytes -7628 bytes (-8.25%)

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.