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

After GZIP compression these minified files vary in size:
unpkg
  174546 bytes (170.5k)
CDN
cdnjs
  141933 bytes (138.6k)
CDN
gzip -6 (default)
  140386 bytes (137.1k)
local copy
jsdelivr
  140276 bytes (137.0k)
CDN
gzip -9
  139851 bytes (136.6k)
local copy
libdeflate -12
  135153 bytes (132.0k)
local copy
7zip -mx=9 -tgzip
  134992 bytes (131.8k)
local copy
pigz -11 -n
  134618 bytes (131.5k)
local copy
kzip -s0 -rn -b0
  134602 bytes (131.4k)
local copy
Zopfli
  134526 bytes (131.4k)
local copy
Zopfli (defluff)
  134523 bytes (131.4k)
local copy

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

You will automatically get the smallest ThreeJS 103 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 5750 bytes by using my ThreeJS 103 Zopfli version instead of the best available CDN (4.27% smaller than jsdelivr, 134526 vs. 140276 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 --bsr23 --lazy --ohh

(found April 3, 2019)
Description Value Parameter
iterations 1000000  --i1000000
maximum blocks 8  --mb8
maximum length score 4096  --mls4096
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 (134523 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/r103/build/three.min.js --location | md5sum
a537251df16772ef01c49e5461c26a7d  -
curl --silent --compressed https://minime.stephan-brumme.com/files/threejs/three-r103.min.zopfli.js.gz | md5sum
a537251df16772ef01c49e5461c26a7d  -

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

All listed CDNs deliver identical contents:
CDN Size (compressed) MD5 (uncompressed) Timestamp
unpkg 174546 bytes a537251df16772ef01c49e5461c26a7d (invalid)
cdnjs 141933 bytes a537251df16772ef01c49e5461c26a7d (invalid)
jsdelivr 140276 bytes a537251df16772ef01c49e5461c26a7d April 1, 2019 @ 13:23

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

Other Versions

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

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
134526 bytes -3 bytes zopfli --i1000000 --mls4096 --bsr23 --lazy --ohh April 3, 2019 @ 10:14
134529 bytes -6 bytes zopfli --i100000 --mls4096 --bsr23 --lazy --ohh April 1, 2019 @ 20:08
134535 bytes -2 bytes zopfli --i10000 --mls4096 --bsr23 --lazy --ohh April 1, 2019 @ 16:53
134537 bytes -1 byte zopfli --i10000 --mls4096 --bsr10 --lazy --ohh April 1, 2019 @ 16:53
134538 bytes -5 bytes zopfli --i10000 --mls4096 --bsr21 --lazy --ohh April 1, 2019 @ 16:52
134543 bytes -18 bytes zopfli --i1000 --mls4096 --bsr23 --lazy --ohh April 1, 2019 @ 14:17
134561 bytes -18 bytes zopfli --i1000 --mls2048 --bsr13 --lazy --ohh April 1, 2019 @ 14:16
134579 bytes zopfli --i100 --mls4096 --bsr21 --lazy --ohh April 1, 2019 @ 13:35

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

Most recent activity on April 3, 2019 @ 11: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
134885 134895 134832 134837 134974 134855 134742 134743 134687 134844 134849 134743 134687 134806 134676
134863 134708 134831 134863 134726 134876 134687 134702 134702 134845 134716 134797 134647 134886 134663
134784 134816 134657 134818 134831 134831 134817 134844 134800 134792 134792 134823 134903 134767 134762
134624 134855 134815 134821 134817 134811 134650 134866 134801 134802 134833 134745 134767 134745 134894
134624 134794 134908 134631 134654 134624 134620 134866 134779 134877 134882 134744 134642 134760 134756
134818 134617 134839 134828 134660 134854 134644 134705 134634 134834 134842 134765 134764 134736 134772
134616 134621 134759 134854 134822 134619 134803 134988 134615 134738 134813 134530 134764 134741 134921
134614 134796 134653 134653 134819 134634 134647 134837 134795 134786 134817 134746 134710 134758 134717
134724 134773 134747 134653 134822 134836 134837 134646 134629 134751 134611 134756 134742 134762 134891
134773 134758 134758 134834 134847 134840 134773 134671 134636 134751 134554 134732 134710 134700 134737
134779 134781 134771 134831 134825 134632 134809 134670 134629 134837 134834 134743 134761 134736 134722
134784 134819 134633 134697 134832 134647 134840 134816 134631 134753 134789 134777 134737 134703 134728
134841 134839 134652 134637 134842 134579 134691 134675 134632 134795 134787 134734 134595 134765 134740
134861 134685 134850 134837 134818 134628 134867 134668 134645 134794 134800 134728 134715 134762 134901
134854 134855 134810 134699 134825 134848 134654 134682 134633 134803 134801 134714 134717 134767 134720
134686 134835 134841 134824 134825 134635 134633 134669 134633 134831 134818 134728 134719 134762 134896
134874 134832 134625 134628 134829 134815 134819 134691 134634 134733 134805 134608 134712 134760 134725
134878 134624 134828 134836 134820 134805 134673 134663 134632 134830 134815 134532 134715 134760 134712
134632 134836 134637 134856 134845 134813 134610 134667 134632 134740 134620 134760 134712 134763 134899
134872 134829 134838 134842 134811 134817 134623 134666 134631 134788 134817 134526 134757 134753 134745
134805 134773 134826 134632 134798 134634 134773 134698 134630 134754 134609 134752 134757 134759 134732
134699 134684 134843 134669 134809 134632 134843 134667 134628 134733 134623 134613 134629 134761 134716
134626 134857 134836 134832 134842 134629 134657 134660 134631 134831 134611 134720 134710 134767 134716

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 134579 bytes 100%
1,000 134543 bytes -36 bytes 100%
10,000 134535 bytes -8 bytes 100%
100,000 134529 bytes -6 bytes 0.87%
1,000,000 134526 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
134602 bytes +76 bytes (+0.06%)
135289 bytes +763 bytes (+0.57%) +687 bytes
135274 bytes +748 bytes (+0.56%) +672 bytes
135095 bytes +569 bytes (+0.42%) +493 bytes
134974 bytes +448 bytes (+0.33%) +372 bytes
134921 bytes +395 bytes (+0.29%) +319 bytes
134741 bytes +215 bytes (+0.16%) +139 bytes
134755 bytes +229 bytes (+0.17%) +153 bytes
134725 bytes +199 bytes (+0.15%) +123 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 90565 bytes -43961 bytes (-32.68%)
RAR (proprietary) RAR rar a -m5 -md64m -mc63:128t -mt1 104167 bytes -30359 bytes (-22.57%)
PPMd (Wikipedia) 7zip 7za a -mx=9 -m0=ppmd 107866 bytes -26660 bytes (-19.82%)
Brotli (Wikipedia) brotli brotli -q 11 114449 bytes -20077 bytes (-14.92%)
LZMA2 (Wikipedia) xz xz -9 115204 bytes -19322 bytes (-14.36%)
Burrows-Wheeler transform (Wikipedia) bzip2 bzip2 -9 119924 bytes -14602 bytes (-10.85%)
Zstandard (Wikipedia) zstd zstd -19 121196 bytes -13330 bytes (-9.91%)

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