Choose a version:
50% The original file has 1197826 bytes (1,169.8k) and is available from the project website.
There you can find the official minified version, too, which brings down the size to 598346 bytes (584.3k, 50%).

After GZIP compression these minified files vary in size:
unpkg
  183489 bytes (179.2k)
CDN
gzip -6 (default)
  150103 bytes (146.6k)
local copy
jsdelivr
  150002 bytes (146.5k)
CDN
gzip -9
  149531 bytes (146.0k)
local copy
7zip -mx=9 -tgzip
  144409 bytes (141.0k)
local copy
libdeflate -12
  144390 bytes (141.0k)
local copy
zultra
  144291 bytes (140.9k)
local copy
kzip -s0 -rn -b0
  144081 bytes (140.7k)
local copy
pigz -11 -n
  144018 bytes (140.6k)
local copy
Zopfli
  144017 bytes (140.6k)
local copy
Zopfli (defluff)
  144014 bytes (140.6k)
local copy

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

You will automatically get the smallest ThreeJS 111 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 5985 bytes by using my ThreeJS 111 Zopfli version instead of the best available CDN (4.16% smaller than jsdelivr, 144017 vs. 150002 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 --mls512 --bsr7 --lazy --ohh

(found November 30, 2019)
Description Value Parameter
iterations 1000000  --i1000000
maximum blocks 8  --mb8
maximum length score 512  --mls512
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 3 more bytes (144014 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/r111/build/three.min.js --location | md5sum
daf1a794272fc7d9234980320460cb71  -
curl --silent --compressed https://minime.stephan-brumme.com/files/threejs/three-r111.min.zopfli.js.gz | md5sum
daf1a794272fc7d9234980320460cb71  -

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

All listed CDNs deliver identical contents:
CDN Size (compressed) MD5 (uncompressed) Timestamp
unpkg 183489 bytes daf1a794272fc7d9234980320460cb71 (invalid)
jsdelivr 150002 bytes daf1a794272fc7d9234980320460cb71 November 28, 2019 @ 10:53

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
144017 bytes -5 bytes zopfli --i1000000 --mls512 --bsr7 --lazy --ohh November 30, 2019 @ 02:20
144022 bytes -7 bytes zopfli --i100000 --mls512 --bsr7 --lazy --ohh November 28, 2019 @ 16:57
144029 bytes -11 bytes zopfli --i10000 --mls512 --bsr7 --lazy --ohh November 28, 2019 @ 11:46
144040 bytes -19 bytes zopfli --i1000 --mls512 --bsr7 --lazy --ohh November 28, 2019 @ 11:15
144059 bytes -29 bytes zopfli --i1000 --mls1024 --bsr11 --lazy --ohh November 28, 2019 @ 11:15
144088 bytes zopfli --i100 --mls16384 --bsr20 --lazy --ohh November 28, 2019 @ 11:11

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

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
144196 144212 144214 144202 144261 144271 144266 144224 144247 144229 144198 144186 144172 144172 144187
144179 144178 144137 144167 144142 144048 144143 144175 144123 144157 144151 144138 144206 144214 144208
144104 144119 144138 144121 144124 144116 144135 144120 144104 144117 144046 144103 144267 144279 144098
144114 144152 144110 144149 144144 144118 144115 144124 144017 144058 144051 144124 144125 144267 144178
144119 144128 144128 144098 144130 144117 144104 144107 144105 144104 144115 144286 144219 144172 144119
144117 144146 144137 144137 144092 144104 144095 144117 144103 144103 144112 144097 144201 144223 144126
144104 144096 144124 144096 144141 144112 144150 144125 144116 144094 144143 144163 144117 144243 144169
144102 144106 144112 144101 144137 144137 144213 144084 144150 144043 144123 144102 144194 144220 144141
144121 144118 144143 144143 144168 144144 144104 144102 144105 144113 144106 144119 144213 144172 144058
144126 144127 144120 144119 144127 144126 144115 144114 144124 144265 144106 144116 144197 144212 144164
144148 144115 144138 144146 144124 144148 144111 144111 144105 144115 144107 144103 144172 144092 144101
144146 144117 144151 144102 144122 144117 144083 144058 144124 144101 144123 144119 144128 144123 144100
144104 144098 144110 144150 144133 144154 144120 144154 144126 144103 144128 144033 144169 144052 144177
144131 144112 144116 144144 144126 144170 144125 144111 144102 144083 144130 144095 144129 144124 144190
144126 144133 144122 144122 144108 144161 144155 144144 144143 144128 144093 144096 144125 144096 144173
144099 144135 144121 144125 144148 144137 144101 144146 144099 144080 144108 144114 144197 144195 144087
144135 144093 144130 144094 144129 144096 144142 144109 144097 144083 144113 144154 144158 144055 144078
144135 144103 144110 144137 144101 144117 144117 144112 144097 144087 144114 144106 144191 144196 144092
144132 144096 144120 144126 144093 144119 144124 144088 144106 144084 144113 144095 144196 144138 144163
144132 144098 144129 144146 144134 144141 144089 144085 144106 144082 144071 144121 144193 144195 144109
144134 144117 144145 144131 144131 144143 144111 144108 144109 144111 144109 144121 144190 144198 144200
144129 144114 144111 144111 144102 144109 144112 144115 144118 144200 144107 144111 144193 144135 144074
144134 144133 144115 144124 144129 144083 144120 144109 144102 144088 144108 144157 144130 144138 144106

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 144088 bytes 100%
1,000 144040 bytes -48 bytes 100%
10,000 144029 bytes -11 bytes 100%
100,000 144022 bytes -7 bytes 0.58%
1,000,000 144017 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
144081 bytes +64 bytes (+0.04%)
144672 bytes +655 bytes (+0.45%) +591 bytes
144613 bytes +596 bytes (+0.41%) +532 bytes
144412 bytes +395 bytes (+0.27%) +331 bytes
144314 bytes +297 bytes (+0.21%) +233 bytes
144329 bytes +312 bytes (+0.22%) +248 bytes
144266 bytes +249 bytes (+0.17%) +185 bytes
144184 bytes +167 bytes (+0.12%) +103 bytes
144191 bytes +174 bytes (+0.12%) +110 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 96583 bytes -47434 bytes (-32.94%)
RAR (proprietary) RAR rar a -m5 -md64m -mc63:128t -mt1 111357 bytes -32660 bytes (-22.68%)
PPMd (Wikipedia) 7zip 7za a -mx=9 -m0=ppmd 116927 bytes -27090 bytes (-18.81%)
Brotli (Wikipedia) brotli brotli -q 11 122215 bytes -21802 bytes (-15.14%)
LZMA2 (Wikipedia) xz xz -9 122924 bytes -21093 bytes (-14.65%)
Burrows-Wheeler transform (Wikipedia) bzip2 bzip2 -9 128179 bytes -15838 bytes (-11.00%)
Zstandard (Wikipedia) zstd zstd -19 128996 bytes -15021 bytes (-10.43%)

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.