Choose a version:
53% The original file has 1154893 bytes (1,127.8k) and is available from the project website.
There you can find the official minified version, too, which brings down the size to 610963 bytes (596.6k, 53%).

After GZIP compression these minified files vary in size:
unpkg
  203531 bytes (198.8k)
CDN
gzip -6 (default)
  151070 bytes (147.5k)
local copy
jsdelivr
  150917 bytes (147.4k)
CDN
gzip -9
  150560 bytes (147.0k)
local copy
libdeflate -12
  145418 bytes (142.0k)
local copy
7zip -mx=9 -tgzip
  145217 bytes (141.8k)
local copy
zultra
  145092 bytes (141.7k)
local copy
Zopfli
  144885 bytes (141.5k)
local copy
kzip -s0 -rn -b0
  144832 bytes (141.4k)
local copy
pigz -11 -n
  144738 bytes (141.3k)
local copy

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

You will automatically get the smallest ThreeJS 129 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 6032 bytes by using my ThreeJS 129 Zopfli version instead of the best available CDN (4.16% smaller than jsdelivr, 144885 vs. 150917 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 --mls32768 --bsr9 --lazy --ohh

(found June 4, 2021)
Description Value Parameter
iterations 1000000  --i1000000
maximum blocks 8  --mb8
maximum length score 32768  --mls32768
block splitting recursion 9  --bsr9
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 6 more bytes (144879 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/r129/build/three.min.js --location | md5sum
2e67183b4272c70275bcd5fc519b5707  -
curl --silent --compressed https://minime.stephan-brumme.com/files/threejs/three-r129.min.zopfli.js.gz | md5sum
2e67183b4272c70275bcd5fc519b5707  -

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

All listed CDNs deliver identical contents:
CDN Size (compressed) MD5 (uncompressed) Timestamp
unpkg 203531 bytes 2e67183b4272c70275bcd5fc519b5707 (invalid)
jsdelivr 150917 bytes 2e67183b4272c70275bcd5fc519b5707 June 1, 2021 @ 16:34

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

Other Versions

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

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
144885 bytes -4 bytes zopfli --i1000000 --mls32768 --bsr9 --lazy --ohh June 4, 2021 @ 13:37
144889 bytes -7 bytes zopfli --i100000 --mls32768 --bsr9 --lazy --ohh June 3, 2021 @ 14:02
144896 bytes -10 bytes zopfli --i10000 --mls32768 --bsr9 --lazy --ohh June 1, 2021 @ 23:12
144906 bytes -2 bytes zopfli --i10000 --mls16384 --bsr30 --lazy --ohh June 1, 2021 @ 22:57
144908 bytes -6 bytes zopfli --i10000 --mls32768 --bsr15 --lazy --ohh June 1, 2021 @ 22:42
144914 bytes -6 bytes zopfli --i1000 --mls16384 --bsr23 --lazy --ohh June 1, 2021 @ 17:54
144920 bytes -2 bytes zopfli --i1000 --mls16384 --bsr30 --lazy --ohh June 1, 2021 @ 17:51
144922 bytes -27 bytes zopfli --i1000 --mls32768 --bsr6 --lazy --ohh June 1, 2021 @ 17:51
144949 bytes zopfli --i100 --mls32768 --bsr9 --lazy --ohh June 1, 2021 @ 17:11

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

Most recent activity on June 4, 2021 @ 14:23.

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
145067 145065 145063 145093 145105 145031 145108 145070 144997 145080 145004 145101 145051 145061 144989
144988 144982 144997 145107 144984 145086 145047 145087 145033 145133 144974 144994 144992 144938 145014
145010 145095 145020 145106 145000 145006 145057 145003 144998 144998 145001 145038 144996 144982 144891
145146 144991 144989 145000 144985 145065 144939 144997 144975 145018 144995 145030 144942 144969 144918
145020 145003 144986 144990 144978 144929 144975 144982 144985 145000 144987 145004 144982 144911 144914
145071 145008 145095 145028 145018 145014 145021 144988 144990 144991 145003 145005 144956 145001 144885
145112 145087 145024 145114 145018 145009 144965 145026 144988 144983 144976 144986 144997 144970 145000
144988 144987 144988 144996 144973 144924 144930 144971 144973 145091 144994 145029 144977 144969 144990
144983 144976 145049 144997 145027 144912 144977 144972 144981 145038 144999 144984 144946 145010 144914
145135 145125 145135 145076 144910 144910 144961 145034 144983 145106 144990 145002 144981 144905 144990
144994 145013 145004 144984 145024 145009 145014 145031 144998 144987 144999 145031 144975 144913 144994
144990 144977 145031 144972 144912 144991 144908 145030 144989 145043 145002 144990 144933 144902 144908
144985 145093 145050 145031 144912 144914 144969 145036 145056 145048 145010 145031 144945 144982 144987
144996 144982 144980 144972 145033 144920 145018 145031 145086 145142 145002 145032 144943 144917 144947
145146 145068 145017 145003 144930 145032 144960 144985 144969 145010 144991 145002 144996 144986 144946
145124 145118 144989 145073 145129 145010 145135 144988 144978 144996 144998 145002 144979 144907 144997
144997 145003 144985 144981 144997 145015 145132 144985 144981 145001 144992 144977 144972 144911 145000
145059 145096 145121 145082 145034 145151 145035 145082 144966 144985 145002 144991 144973 144910 145002
145054 145058 145054 145082 145030 145015 145012 145034 144971 145111 145001 145003 145000 144952 145016
145085 145055 145050 145084 145026 144922 145037 144979 144966 144999 145009 144993 144993 144905 144986
144996 145005 144982 145003 145001 144970 144969 144983 144983 145001 145009 144988 144940 144997 144985
145099 145051 145048 145083 144970 144986 145011 144980 144976 145001 144983 144989 144989 144906 144981
145150 145103 145046 145088 145027 144913 145030 145030 144971 145043 144997 144981 144987 144908 144975

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 144949 bytes 100%
1,000 144914 bytes -35 bytes 100%
10,000 144896 bytes -18 bytes 100%
100,000 144889 bytes -7 bytes 0.58%
1,000,000 144885 bytes -4 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
144832 bytes -53 bytes (-0.04%)
145336 bytes +451 bytes (+0.31%) +504 bytes
145352 bytes +467 bytes (+0.32%) +520 bytes
145096 bytes +211 bytes (+0.15%) +264 bytes
145062 bytes +177 bytes (+0.12%) +230 bytes
145080 bytes +195 bytes (+0.13%) +248 bytes
145048 bytes +163 bytes (+0.11%) +216 bytes
145044 bytes +159 bytes (+0.11%) +212 bytes
144963 bytes +78 bytes (+0.05%) +131 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 - for example, your browser actually supports it !
Algorithm Program Parameters Size Compared To Best Zopfli
ZPAQ (Wikipedia) zpaq zpaq -method 69 97610 bytes -47275 bytes (-32.63%)
RAR (proprietary) RAR rar a -m5 -md64m -mc63:128t -mt1 112465 bytes -32420 bytes (-22.38%)
PPMd (Wikipedia) 7zip 7za a -mx=9 -m0=ppmd 116582 bytes -28303 bytes (-19.53%)
Brotli (Wikipedia) brotli brotli -q 11 122470 bytes -22415 bytes (-15.47%)
LZMA2 (Wikipedia) xz xz -9 122800 bytes -22085 bytes (-15.24%)
Zstandard (Wikipedia) zstd zstd -19 128862 bytes -16023 bytes (-11.06%)
Burrows-Wheeler transform (Wikipedia) bzip2 bzip2 -9 129975 bytes -14910 bytes (-10.29%)

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