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

After GZIP compression these minified files vary in size:
Boot
  120376 bytes (117.6k)
CDN
cdnjs
  100372 bytes (98.0k)
CDN
gzip -6 (default)
  99364 bytes (97.0k)
local copy
gzip -9
  98964 bytes (96.6k)
local copy
libdeflate -12
  95441 bytes (93.2k)
local copy
7zip -mx=9 -tgzip
  95320 bytes (93.1k)
local copy
zultra
  95306 bytes (93.1k)
local copy
pigz -11 -n
  94987 bytes (92.8k)
local copy
kzip -s0 -rn -b0
  94903 bytes (92.7k)
local copy
Zopfli
  94889 bytes (92.7k)
local copy
Zopfli (defluff)
  94887 bytes (92.7k)
local copy

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

You will automatically get the smallest ThreeJS 65 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 5483 bytes by using my ThreeJS 65 Zopfli version instead of the best available CDN (5.78% smaller than cdnjs, 94889 vs. 100372 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 --mls256 --bsr19 --lazy --ohh

(found February 4, 2017)
Description Value Parameter
iterations 1000000  --i1000000
maximum blocks 8  --mb8
maximum length score 256  --mls256
block splitting recursion 19  --bsr19
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 (94887 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/r65/build/three.min.js --location | md5sum
4e25e86704c4dd1f157a49a45afcfaae  -
curl --silent --compressed https://minime.stephan-brumme.com/files/threejs/three-r65.min.zopfli.js.gz | md5sum
4e25e86704c4dd1f157a49a45afcfaae  -

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

All listed CDNs deliver identical contents:
CDN Size (compressed) MD5 (uncompressed) Timestamp
Boot 120376 bytes 4e25e86704c4dd1f157a49a45afcfaae (invalid)
cdnjs 100372 bytes 4e25e86704c4dd1f157a49a45afcfaae (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
94889 bytes -5 bytes zopfli --i1000000 --mls256 --bsr19 --lazy --ohh February 4, 2017 @ 11:07
94894 bytes -11 bytes zopfli --i100000 --mls256 --bsr19 --lazy --ohh December 29, 2015 @ 10:58
94905 bytes -8 bytes zopfli --i10000 --mls256 --bsr19 --lazy --ohh November 16, 2015 @ 14:16
94913 bytes -7 bytes zopfli --i1000 --mls256 --bsr19 --lazy --ohh November 16, 2015 @ 10:58
94920 bytes -11 bytes zopfli --i1000 --mls128 --bsr40 --lazy --ohh November 16, 2015 @ 09:07
94931 bytes -28 bytes zopfli --i1000 --mls256 --bsr10 --lazy --ohh November 16, 2015 @ 08:21
94959 bytes zopfli --i100 --mls256 --bsr10 --lazy --ohh November 16, 2015 @ 08:19

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

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
94998 94997 94994 94993 95036 95038 95000 95010 95037 95034 95060 95017 95031 95156 95081
94995 94977 94988 95025 94963 94970 94998 94974 94951 94988 95085 95093 95027 94981 95112
95032 95030 94982 95004 95093 94967 94920 94963 94997 94965 95103 95119 94996 95009 95089
95001 94953 94964 94994 95013 95014 94971 94968 95031 94965 95078 95039 95012 94983 94971
95014 95010 95032 94965 94983 94948 95005 94945 94948 95015 95046 94987 94961 95008 94963
95015 95072 94959 95021 95010 95015 94958 94963 95056 94966 95108 95082 95009 94996 95102
95034 95019 95012 95015 94990 95014 94999 94922 94945 95013 94980 94989 95009 95009 94975
95018 95015 95014 95080 95096 94958 95002 94958 95007 95017 94981 94987 94990 95007 94966
94957 95011 94957 95006 95046 94955 95006 94994 95080 95043 94936 94982 95022 95001 94976
95020 95012 95005 95025 95017 95011 94964 94950 94944 95016 94961 94989 94999 94995 94964
95028 95012 95008 95011 95013 95009 95005 95003 94959 94972 94954 94958 95017 95015 94957
95025 94951 95002 95006 95014 95015 95011 94932 95013 94966 94967 94968 95015 95003 94994
95029 95009 95013 95027 94984 95012 95010 94948 95028 94964 94964 94986 94963 95013 95003
95035 94957 95014 95011 95008 95011 95006 95019 94958 94965 94956 94987 94985 95012 94969
95036 95016 95034 95010 95009 95007 94952 94948 94900 94968 94984 94979 94992 95002 94960
95038 94957 94992 94989 94998 95016 95003 94889 95005 95044 94983 94990 94964 94988 94968
95040 94957 95112 95107 94975 95002 95007 94905 94948 94968 94956 94959 95042 95000 94970
95034 95012 95074 95119 95062 95064 94944 94957 95012 94968 95043 94983 94986 95005 95004
95040 95119 95113 95003 94994 95003 94992 94990 95029 94969 94977 94975 94977 94957 94965
95035 95010 94954 95101 94947 95003 94957 94920 94949 94968 94979 94981 95012 95006 94999
95023 95030 94955 95002 94952 95001 95013 94966 94952 94969 94956 94984 94986 95006 95003
95026 95013 95008 95005 95016 95016 95005 94942 94948 95020 94977 95016 95015 95003 94978
95022 95007 95026 95027 95028 94951 94914 94953 94948 95007 94960 94986 95014 94986 94994

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 94938 bytes 100%
1,000 94913 bytes -25 bytes 100%
10,000 94905 bytes -8 bytes 100%
100,000 94894 bytes -11 bytes 0.87%
1,000,000 94889 bytes -5 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
94903 bytes +14 bytes (+0.01%)
95358 bytes +469 bytes (+0.49%) +455 bytes
95230 bytes +341 bytes (+0.36%) +327 bytes
95252 bytes +363 bytes (+0.38%) +349 bytes
95157 bytes +268 bytes (+0.28%) +254 bytes
95129 bytes +240 bytes (+0.25%) +226 bytes
95026 bytes +137 bytes (+0.14%) +123 bytes
94998 bytes +109 bytes (+0.11%) +95 bytes
94919 bytes +30 bytes (+0.03%) +16 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 65406 bytes -29483 bytes (-31.07%)
RAR (proprietary) RAR rar a -m5 -md64m -mc63:128t -mt1 75143 bytes -19746 bytes (-20.81%)
PPMd (Wikipedia) 7zip 7za a -mx=9 -m0=ppmd 80277 bytes -14612 bytes (-15.40%)
Brotli (Wikipedia) brotli brotli -q 11 81283 bytes -13606 bytes (-14.34%)
LZMA2 (Wikipedia) xz xz -9 81888 bytes -13001 bytes (-13.70%)
Zstandard (Wikipedia) zstd zstd -19 87105 bytes -7784 bytes (-8.20%)
Burrows-Wheeler transform (Wikipedia) bzip2 bzip2 -9 87486 bytes -7403 bytes (-7.80%)

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.