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

After GZIP compression these minified files vary in size:
unpkg
  185603 bytes (181.3k)
CDN
Google
  153299 bytes (149.7k)
CDN
gzip -6 (default)
  151942 bytes (148.4k)
local copy
jsdelivr
  151791 bytes (148.2k)
CDN
gzip -9
  151342 bytes (147.8k)
local copy
libdeflate -12
  146191 bytes (142.8k)
local copy
7zip -mx=9 -tgzip
  146063 bytes (142.6k)
local copy
zultra
  145986 bytes (142.6k)
local copy
kzip -s0 -rn -b0
  145723 bytes (142.3k)
local copy
Zopfli
  145722 bytes (142.3k)
local copy
pigz -11 -n
  145675 bytes (142.3k)
local copy

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

You will automatically get the smallest ThreeJS 113 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 6069 bytes by using my ThreeJS 113 Zopfli version instead of the best available CDN (4.16% smaller than jsdelivr, 145722 vs. 151791 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 --mls1024 --bsr16 --lazy --ohh

(found February 21, 2020)
Description Value Parameter
iterations 1000000  --i1000000
maximum blocks 8  --mb8
maximum length score 1024  --mls1024
block splitting recursion 16  --bsr16
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 (145719 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/r113/build/three.min.js --location | md5sum
4fccc421b11e45f93625db9efe17a143  -
curl --silent --compressed https://minime.stephan-brumme.com/files/threejs/three-r113.min.zopfli.js.gz | md5sum
4fccc421b11e45f93625db9efe17a143  -

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

These CDNs send you the original file:
CDN Size (compressed) MD5 (uncompressed) Timestamp
unpkg 185603 bytes 4fccc421b11e45f93625db9efe17a143 (invalid)
jsdelivr 151791 bytes 4fccc421b11e45f93625db9efe17a143 February 19, 2020 @ 13:14

And some CDNs send you a different file:
CDN Size (compressed) MD5 (uncompressed) Comment / Diff Timestamp
Google 153299 bytes ec91ebabfe62d9ed0daa6284b962b498 > /**
> * @license
> *
> * The MIT License
> *
> * Copyright © 2010-2020 three.js authors
> *
> * Permission is hereby granted, free of charge, to any pe [...]
> * of this software and associated documentation files (th [...]
> * in the Software without restriction, including without [...]
[...]
February 19, 2020 @ 20:15

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
145722 bytes -4 bytes zopfli --i1000000 --mls1024 --bsr16 --lazy --ohh February 21, 2020 @ 06:48
145726 bytes -8 bytes zopfli --i100000 --mls1024 --bsr16 --lazy --ohh February 19, 2020 @ 23:40
145734 bytes -7 bytes zopfli --i10000 --mls1024 --bsr16 --lazy --ohh February 19, 2020 @ 19:28
145741 bytes -40 bytes zopfli --i1000 --mls1024 --bsr16 --lazy --ohh February 19, 2020 @ 15:30
145781 bytes zopfli --i100 --mls1024 --bsr16 --lazy --ohh February 19, 2020 @ 13:48

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

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
145951 145957 145920 145929 145941 145836 145925 145849 145910 145879 145800 145957 145927 145866 145897
145897 145895 145969 145908 145916 145914 145906 145967 145875 145957 145900 145900 145869 145903 145869
145825 145830 145832 145830 145878 145865 145803 145818 145841 145880 145811 145857 145835 145846 145822
145867 145834 145877 145853 145855 145828 145824 145856 145825 145778 145780 145828 145910 145917 145861
145859 145867 145852 145916 145872 145820 145870 145826 145835 145862 145843 145861 145925 145925 145845
145867 145853 145869 145873 145868 145818 145817 145816 145815 145856 145824 145869 145910 145908 145868
145864 145925 145932 145909 145869 145905 145864 145853 145876 145840 145829 145835 145842 145937 145851
145867 145874 145852 145951 145893 145858 145853 145868 145936 145775 145784 145864 145859 145913 145866
145896 145885 145893 145911 145938 145846 145843 145839 145840 145794 145853 145874 145861 145845 145879
145856 145858 145859 145861 145857 145822 145853 145842 145836 145942 145844 145876 145912 145908 145855
145876 145881 145873 145927 145870 145843 145803 145823 145813 145753 145782 145868 145838 145833 145864
145879 145879 145871 145862 145860 145826 145812 145813 145842 145793 145846 145875 145909 145912 145847
145845 145857 145847 145904 145868 145830 145904 145844 145817 145722 145794 145862 145836 145842 145845
145921 145916 145922 145902 145893 145856 145845 145822 145818 145857 145833 145859 145922 145910 145894
145862 145864 145867 145855 145900 145842 145815 145937 145942 145781 145844 145888 145859 145842 145765
145846 145857 145875 145906 145891 145855 145821 145838 145838 145809 145790 145864 145908 145910 145843
145845 145854 145857 145869 145855 145821 145796 145813 145809 145783 145820 145845 145835 145847 145855
145869 145875 145873 145904 145889 145872 145874 145824 145837 145823 145816 145862 145911 145921 145866
145850 145848 145845 145855 145900 145821 145800 145797 145823 145824 145843 145862 145780 145826 145867
145874 145882 145872 145862 145894 145841 145831 145841 145809 145783 145809 145868 145908 145910 145797
145851 145846 145850 145857 145908 145820 145813 145830 145844 145782 145819 145867 145912 145913 145866
145876 145879 145857 145866 145892 145818 145818 145839 145819 145790 145820 145864 145861 145838 145847
145869 145863 145859 145927 145901 145854 145821 145844 145816 145769 145839 145877 145839 145850 145845

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 145781 bytes 100%
1,000 145741 bytes -40 bytes 100%
10,000 145734 bytes -7 bytes 100%
100,000 145726 bytes -8 bytes 0.58%
1,000,000 145722 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
145723 bytes +1 byte (0.00%)
146387 bytes +665 bytes (+0.46%) +664 bytes
146340 bytes +618 bytes (+0.42%) +617 bytes
146081 bytes +359 bytes (+0.25%) +358 bytes
145982 bytes +260 bytes (+0.18%) +259 bytes
145973 bytes +251 bytes (+0.17%) +250 bytes
145934 bytes +212 bytes (+0.15%) +211 bytes
145870 bytes +148 bytes (+0.10%) +147 bytes
145857 bytes +135 bytes (+0.09%) +134 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 97518 bytes -48204 bytes (-33.08%)
RAR (proprietary) RAR rar a -m5 -md64m -mc63:128t -mt1 112745 bytes -32977 bytes (-22.63%)
PPMd (Wikipedia) 7zip 7za a -mx=9 -m0=ppmd 118386 bytes -27336 bytes (-18.76%)
Brotli (Wikipedia) brotli brotli -q 11 123452 bytes -22270 bytes (-15.28%)
LZMA2 (Wikipedia) xz xz -9 124220 bytes -21502 bytes (-14.76%)
Burrows-Wheeler transform (Wikipedia) bzip2 bzip2 -9 129789 bytes -15933 bytes (-10.93%)
Zstandard (Wikipedia) zstd zstd -19 130364 bytes -15358 bytes (-10.54%)

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.