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

After GZIP compression these minified files vary in size:
unpkg
  172440 bytes (168.4k)
CDN
cdnjs
  140304 bytes (137.0k)
CDN
gzip -6 (default)
  138820 bytes (135.6k)
local copy
jsdelivr
  138675 bytes (135.4k)
CDN
gzip -9
  138304 bytes (135.1k)
local copy
libdeflate -12
  133517 bytes (130.4k)
local copy
7zip -mx=9 -tgzip
  133505 bytes (130.4k)
local copy
pigz -11 -n
  133157 bytes (130.0k)
local copy
kzip -s0 -rn -b0
  133147 bytes (130.0k)
local copy
Zopfli
  133016 bytes (129.9k)
local copy
Zopfli (defluff)
  133012 bytes (129.9k)
local copy

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

You will automatically get the smallest ThreeJS 101 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 5659 bytes by using my ThreeJS 101 Zopfli version instead of the best available CDN (4.25% smaller than jsdelivr, 133016 vs. 138675 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 --mls4096 --bsr30 --lazy --ohh

(found February 3, 2019)
Description Value Parameter
iterations 1000000  --i1000000
maximum blocks 8  --mb8
maximum length score 4096  --mls4096
block splitting recursion 30  --bsr30
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 (133012 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/r101/build/three.min.js --location | md5sum
6351be42f811a3931c6002b296e1f038  -
curl --silent --compressed https://minime.stephan-brumme.com/files/threejs/three-r101.min.zopfli.js.gz | md5sum
6351be42f811a3931c6002b296e1f038  -

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

These CDNs send you the original file:
CDN Size (compressed) MD5 (uncompressed) Timestamp
cdnjs 140304 bytes 6351be42f811a3931c6002b296e1f038 (invalid)

And some CDNs send you a different file:
CDN Size (compressed) MD5 (uncompressed) Comment / Diff Timestamp
unpkg 172440 bytes 147b1e08db2a8015fa94e4bfc6ef6902 < // threejs.org/license
(invalid)
jsdelivr 138675 bytes 147b1e08db2a8015fa94e4bfc6ef6902 < // threejs.org/license
February 1, 2019 @ 10:47

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

Other Versions

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

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
133016 bytes -6 bytes zopfli --i1000000 --mls4096 --bsr30 --lazy --ohh February 3, 2019 @ 15:11
133022 bytes -7 bytes zopfli --i100000 --mls4096 --bsr30 --lazy --ohh February 1, 2019 @ 19:28
133029 bytes -1 byte zopfli --i100000 --mls4096 --bsr13 --lazy --ohh February 1, 2019 @ 15:35
133030 bytes -7 bytes zopfli --i10000 --mls4096 --bsr30 --lazy --ohh February 1, 2019 @ 13:43
133037 bytes -9 bytes zopfli --i10000 --mls4096 --bsr13 --lazy --ohh February 1, 2019 @ 12:08
133046 bytes -12 bytes zopfli --i1000 --mls4096 --bsr13 --lazy --ohh February 1, 2019 @ 11:22
133058 bytes -3 bytes zopfli --i1000 --mls8192 --bsr10 --lazy --ohh February 1, 2019 @ 11:21
133061 bytes -11 bytes zopfli --i1000 --mls4096 --bsr19 --lazy --ohh February 1, 2019 @ 11:21
133072 bytes zopfli --i100 --mls4096 --bsr13 --lazy --ohh February 1, 2019 @ 10:52

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

Most recent activity on February 4, 2019 @ 08:58.

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
133278 133277 133232 133240 133288 133287 133281 133364 133288 133280 133291 133267 133277 133257 133260
133192 133142 133134 133365 133345 133364 133245 133144 133231 133355 133347 133338 133252 133307 133136
133078 133097 133313 133128 133340 133323 133323 133097 133163 133363 133220 133089 133383 133389 133289
133102 133150 133286 133310 133327 133110 133303 133118 133329 133168 133314 133245 133122 133289 133280
133115 133324 133307 133289 133295 133296 133282 133094 133290 133127 133043 133251 133109 133284 133228
133328 133306 133134 133306 133323 133308 133237 133193 133164 133304 133293 133056 133284 133305 133305
133282 133285 133288 133291 133319 133289 133286 133111 133109 133107 133064 133075 133045 133319 133268
133289 133289 133097 133090 133295 133294 133284 133343 133332 133315 133291 133106 133124 133291 133283
133302 133292 133292 133315 133304 133076 133295 133169 133277 133308 133198 133248 133290 133282 133293
133286 133292 133286 133280 133285 133091 133281 133143 133290 133301 133051 133029 133289 133278 133295
133295 133296 133312 133331 133339 133077 133316 133170 133080 133312 133285 133111 133314 133280 133281
133253 133254 133281 133123 133288 133311 133246 133348 133143 133165 133073 133044 133058 133304 133275
133292 133300 133290 133316 133309 133285 133104 133106 133330 133305 133286 133284 133310 133297 133288
133324 133133 133328 133312 133305 133298 133341 133159 133162 133256 133139 133097 133104 133285 133264
133132 133310 133322 133304 133309 133317 133336 133168 133120 133334 133073 133067 133286 133284 133253
133310 133289 133336 133305 133294 133306 133283 133348 133164 133303 133111 133045 133100 133279 133291
133323 133290 133291 133311 133295 133304 133090 133108 133131 133307 133288 133294 133286 133292 133277
133276 133285 133283 133142 133279 133278 133300 133341 133166 133304 133288 133048 133118 133281 133289
133292 133294 133278 133284 133283 133307 133278 133145 133164 133305 133296 133071 133098 133288 133278
133286 133292 133287 133117 133284 133300 133282 133132 133119 133256 133072 133075 133098 133283 133254
133301 133297 133282 133136 133296 133302 133251 133333 133282 133249 133065 133060 133291 133294 133275
133297 133295 133281 133293 133298 133064 133293 133330 133129 133253 133077 133016 133291 133311 133243
133300 133293 133285 133303 133294 133290 133097 133329 133136 133304 133282 133098 133043 133108 133267

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 133072 bytes 100%
1,000 133046 bytes -26 bytes 100%
10,000 133030 bytes -16 bytes 100%
100,000 133022 bytes -8 bytes 0.58%
1,000,000 133016 bytes -6 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
133147 bytes +131 bytes (+0.10%)
133774 bytes +758 bytes (+0.57%) +627 bytes
133736 bytes +720 bytes (+0.54%) +589 bytes
133613 bytes +597 bytes (+0.45%) +466 bytes
133458 bytes +442 bytes (+0.33%) +311 bytes
133306 bytes +290 bytes (+0.22%) +159 bytes
133257 bytes +241 bytes (+0.18%) +110 bytes
133269 bytes +253 bytes (+0.19%) +122 bytes
133249 bytes +233 bytes (+0.18%) +102 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 89611 bytes -43405 bytes (-32.63%)
RAR (proprietary) RAR rar a -m5 -md64m -mc63:128t -mt1 103084 bytes -29932 bytes (-22.50%)
PPMd (Wikipedia) 7zip 7za a -mx=9 -m0=ppmd 106762 bytes -26254 bytes (-19.74%)
Brotli (Wikipedia) brotli brotli -q 11 113240 bytes -19776 bytes (-14.87%)
LZMA2 (Wikipedia) xz xz -9 113996 bytes -19020 bytes (-14.30%)
Burrows-Wheeler transform (Wikipedia) bzip2 bzip2 -9 118687 bytes -14329 bytes (-10.77%)
Zstandard (Wikipedia) zstd zstd -19 119916 bytes -13100 bytes (-9.85%)

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 2019.
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