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

After GZIP compression these minified files vary in size:
Boot
  119642 bytes (116.8k)
CDN
cdnjs
  99989 bytes (97.6k)
CDN
gzip -6 (default)
  99024 bytes (96.7k)
local copy
gzip -9
  98620 bytes (96.3k)
local copy
libdeflate -12
  95305 bytes (93.1k)
local copy
zultra
  95287 bytes (93.1k)
local copy
7zip -mx=9 -tgzip
  95249 bytes (93.0k)
local copy
pigz -11 -n
  94873 bytes (92.6k)
local copy
kzip -s0 -rn -b0
  94824 bytes (92.6k)
local copy
Zopfli
  94792 bytes (92.6k)
local copy
Zopfli (defluff)
  94789 bytes (92.6k)
local copy

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

You will automatically get the smallest ThreeJS 64 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 5197 bytes by using my ThreeJS 64 Zopfli version instead of the best available CDN (5.48% smaller than cdnjs, 94792 vs. 99989 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 --bsr23 --lazy --ohh

(found February 4, 2017)
Description Value Parameter
iterations 1000000  --i1000000
maximum blocks 8  --mb8
maximum length score 1024  --mls1024
block splitting recursion 23  --bsr23
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 (94789 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/r64/build/three.min.js --location | md5sum
23659283ddd507891c18e4c45ce97f62  -
curl --silent --compressed https://minime.stephan-brumme.com/files/threejs/three-r64.min.zopfli.js.gz | md5sum
23659283ddd507891c18e4c45ce97f62  -

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

All listed CDNs deliver identical contents:
CDN Size (compressed) MD5 (uncompressed) Timestamp
Boot 119642 bytes 23659283ddd507891c18e4c45ce97f62 (invalid)
cdnjs 99989 bytes 23659283ddd507891c18e4c45ce97f62 (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
94792 bytes -3 bytes zopfli --i1000000 --mls1024 --bsr23 --lazy --ohh February 4, 2017 @ 09:51
94795 bytes -4 bytes zopfli --i100000 --mls1024 --bsr23 --lazy --ohh December 29, 2015 @ 10:50
94799 bytes -5 bytes zopfli --i10000 --mls1024 --bsr23 --lazy --ohh November 16, 2015 @ 23:10
94804 bytes -8 bytes zopfli --i10000 --mls1024 --bsr18 --lazy --ohh November 16, 2015 @ 22:21
94812 bytes -22 bytes zopfli --i1000 --mls1024 --bsr23 --lazy --ohh November 16, 2015 @ 13:26
94834 bytes zopfli --i100 --mls1024 --bsr18 --lazy --ohh November 15, 2015 @ 11:42

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
94928 94989 94929 94926 94971 94923 94975 94939 94923 94935 95035 95034 94864 94975 94970
94927 94929 94918 94976 94909 94955 94931 94936 94923 94820 94939 95095 94916 94912 94932
94938 95004 94990 94901 95020 95018 94906 94904 94904 94932 94937 94940 95005 94959 94932
95002 95006 94990 94981 94899 94900 94900 94884 94892 94898 94810 94921 94904 94894 94916
95005 94988 95070 95079 94955 94892 94913 94891 94961 94927 95028 94913 94922 94914 94924
95004 94993 95067 94967 95013 95010 94898 94890 94896 94897 94884 94847 94910 94969 94877
95002 95004 95005 95079 94888 95007 94913 94899 94836 94912 94918 94902 94917 94962 94913
94957 95070 95074 94953 95078 95079 94902 94879 94902 94920 94913 94903 94877 94968 94896
94954 94958 94898 94972 94909 94902 94913 95011 94976 94925 94916 94854 94902 94956 94923
94990 94978 94946 94947 94961 94903 94908 94892 94965 94938 94911 94910 94907 94968 94953
94993 94991 94993 94998 94910 94910 94902 94955 94977 94991 94919 94914 94904 94916 94902
94967 94957 94949 94959 94901 94897 94898 94950 94897 94901 94923 94913 94901 94892 94927
94988 94988 94944 94937 94942 94898 94965 94879 94892 94920 94923 94917 94917 94942 94975
94996 94987 94991 94952 94941 94911 94913 94887 94882 94923 94866 94973 94895 94904 94891
94949 94996 94891 94944 94886 94900 94901 94888 94990 94798 94871 94884 94894 94898 94923
94958 94955 94950 94958 94908 94910 94965 94894 94912 94912 94914 94910 94894 94953 94925
95002 94989 94985 94951 95007 95033 94898 94962 94973 94804 94923 94914 94900 94965 94926
95005 94995 95099 94949 94887 95006 95002 94890 94860 94922 94916 94914 94909 94965 94919
95023 95020 95075 94949 94958 95080 94995 94889 94891 94923 94913 94910 94908 94914 94873
95018 94995 95071 94952 95007 95101 94900 94881 94985 94792 94920 94912 94895 94959 94914
94942 95001 94950 94946 94907 94908 94900 94881 94991 94810 94917 94904 94895 94965 94928
94991 94987 94953 94958 94969 94969 94900 94892 94835 94811 94918 94899 94901 94969 94874
94960 94992 94987 94960 94908 94906 95025 94886 94982 94920 94914 94909 94910 94965 94907

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 94834 bytes 100%
1,000 94812 bytes -22 bytes 100%
10,000 94799 bytes -13 bytes 100%
100,000 94795 bytes -4 bytes 0.58%
1,000,000 94792 bytes -3 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
94824 bytes +32 bytes (+0.03%)
95340 bytes +548 bytes (+0.58%) +516 bytes
95223 bytes +431 bytes (+0.45%) +399 bytes
95208 bytes +416 bytes (+0.44%) +384 bytes
95095 bytes +303 bytes (+0.32%) +271 bytes
95069 bytes +277 bytes (+0.29%) +245 bytes
94954 bytes +162 bytes (+0.17%) +130 bytes
94919 bytes +127 bytes (+0.13%) +95 bytes
94845 bytes +53 bytes (+0.06%) +21 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 64970 bytes -29822 bytes (-31.46%)
RAR (proprietary) RAR rar a -m5 -md64m -mc63:128t -mt1 74573 bytes -20219 bytes (-21.33%)
PPMd (Wikipedia) 7zip 7za a -mx=9 -m0=ppmd 79627 bytes -15165 bytes (-16.00%)
Brotli (Wikipedia) brotli brotli -q 11 80892 bytes -13900 bytes (-14.66%)
LZMA2 (Wikipedia) xz xz -9 81480 bytes -13312 bytes (-14.04%)
Zstandard (Wikipedia) zstd zstd -19 86620 bytes -8172 bytes (-8.62%)
Burrows-Wheeler transform (Wikipedia) bzip2 bzip2 -9 86816 bytes -7976 bytes (-8.41%)

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.