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

After GZIP compression these minified files vary in size:
Boot
  125790 bytes (122.8k)
CDN
cdnjs
  104877 bytes (102.4k)
CDN
unpkg
  104284 bytes (101.8k)
CDN
gzip -6 (default)
  103848 bytes (101.4k)
local copy
Google
  103825 bytes (101.4k)
CDN
gzip -9
  103425 bytes (101.0k)
local copy
libdeflate -12
  100026 bytes (97.7k)
local copy
7zip -mx=9 -tgzip
  99949 bytes (97.6k)
local copy
zultra
  99890 bytes (97.5k)
local copy
pigz -11 -n
  99613 bytes (97.3k)
local copy
kzip -s0 -rn -b0
  99604 bytes (97.3k)
local copy
Zopfli
  99570 bytes (97.2k)
local copy
Zopfli (defluff)
  99567 bytes (97.2k)
local copy

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

You will automatically get the smallest ThreeJS 67 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 4255 bytes by using my ThreeJS 67 Zopfli version instead of the best available CDN (4.27% smaller than Google, 99570 vs. 103825 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 --mls16 --bsr6 --lazy --ohh

(found January 28, 2017)
Description Value Parameter
iterations 1000000  --i1000000
maximum blocks 8  --mb8
maximum length score 16  --mls16
block splitting recursion 6  --bsr6
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 (99567 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/r67/build/three.min.js --location | md5sum
469fcbf81e268a5cc1c425c71c9c5f9c  -
curl --silent --compressed https://minime.stephan-brumme.com/files/threejs/three-r67.min.zopfli.js.gz | md5sum
469fcbf81e268a5cc1c425c71c9c5f9c  -

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

These CDNs send you the original file:
CDN Size (compressed) MD5 (uncompressed) Timestamp
Boot 125790 bytes 469fcbf81e268a5cc1c425c71c9c5f9c (invalid)
cdnjs 104877 bytes 469fcbf81e268a5cc1c425c71c9c5f9c (invalid)
Google 103825 bytes 469fcbf81e268a5cc1c425c71c9c5f9c (invalid)

And some CDNs send you a different file:
CDN Size (compressed) MD5 (uncompressed) Comment / Diff Timestamp
unpkg 104284 bytes ce30e006c918696869fe38ae4e8e2e26 < // three.js / threejs.org/license
> var self = self || {};// three.js / threejs.org/license
>
> // Export the THREE object for **Node.js**, with
> // backwards-compatibility for the old `require()` API. If [...]
> // the browser, add `_` as a global object via a string id [...]
> // for Closure Compiler "advanced" mode.
> if (typeof exports !== 'undefined') {
> if (typeof module !== 'undefined' && module.exports) {
> exports = module.exports = THREE;
[...]
July 11, 2016 @ 15:49

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
99570 bytes -6 bytes zopfli --i1000000 --mls16 --bsr6 --lazy --ohh January 28, 2017 @ 13:27
99576 bytes -6 bytes zopfli --i100000 --mls16 --bsr6 --lazy --ohh December 29, 2015 @ 10:59
99582 bytes -12 bytes zopfli --i10000 --mls16 --bsr6 --lazy --ohh November 16, 2015 @ 04:26
99594 bytes -27 bytes zopfli --i1000 --mls16 --bsr6 --lazy --ohh November 15, 2015 @ 22:32
99621 bytes -3 bytes zopfli --i1000 --mls8 --bsr40 --lazy --ohh November 15, 2015 @ 21:56
99624 bytes zopfli --i100 --mls16 --bsr6 --lazy --ohh November 15, 2015 @ 12:27

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

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 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
99653 99649 99790 99794 99664 99699 99673 99671 99673 99694 99660 99830 99670 99677 99868
99647 99687 99648 99660 99668 99679 99622 99650 99865 99659 99624 99657 99623 99647 99638
99641 99640 99608 99570 99619 99638 99608 99626 99631 99631 99861 99859 99684 99648 99859
99648 99640 99661 99658 99620 99625 99628 99790 99629 99639 99632 99623 99627 99673 99621
99617 99616 99719 99648 99659 99615 99645 99610 99638 99689 99631 99628 99652 99657 99843
99736 99738 99743 99631 99663 99640 99619 99616 99635 99619 99630 99862 99616 99626 99696
99741 99735 99648 99643 99719 99619 99721 99726 99636 99745 99639 99799 99615 99613 99847
99752 99742 99741 99654 99630 99606 99606 99630 99618 99631 99635 99632 99620 99639 99855
99742 99621 99659 99658 99745 99750 99747 99631 99619 99675 99636 99631 99632 99618 99823
99721 99746 99631 99625 99647 99619 99626 99633 99629 99625 99636 99630 99637 99623 99847
99621 99604 99612 99665 99653 99626 99653 99611 99629 99674 99633 99624 99671 99623 99694
99619 99636 99610 99627 99633 99658 99626 99605 99631 99780 99634 99762 99629 99631 99855
99625 99623 99615 99623 99640 99619 99626 99616 99648 99664 99634 99647 99640 99625 99848
99620 99634 99609 99640 99628 99628 99666 99616 99633 99662 99628 99630 99613 99624 99856
99664 99648 99613 99631 99627 99634 99616 99632 99629 99631 99630 99835 99635 99643 99847
99729 99628 99638 99671 99623 99656 99630 99625 99627 99676 99631 99628 99664 99618 99849
99620 99641 99638 99625 99634 99632 99627 99615 99618 99678 99635 99627 99645 99669 99625
99632 99609 99611 99629 99621 99631 99620 99627 99615 99630 99636 99643 99667 99631 99871
99739 99736 99630 99611 99723 99618 99622 99609 99631 99654 99632 99841 99657 99623 99851
99725 99743 99720 99611 99636 99607 99635 99611 99633 99653 99631 99634 99652 99644 99655
99744 99635 99609 99619 99612 99613 99619 99629 99631 99673 99631 99651 99631 99733 99844
99619 99635 99631 99628 99633 99630 99621 99614 99628 99623 99635 99637 99640 99620 99646
99618 99640 99606 99629 99623 99610 99617 99618 99629 99673 99629 99628 99620 99613 99853

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 99624 bytes 100%
1,000 99594 bytes -30 bytes 100%
10,000 99582 bytes -12 bytes 100%
100,000 99576 bytes -6 bytes 0.29%
1,000,000 99570 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
99604 bytes +34 bytes (+0.03%)
100118 bytes +548 bytes (+0.55%) +514 bytes
100075 bytes +505 bytes (+0.51%) +471 bytes
99910 bytes +340 bytes (+0.34%) +306 bytes
99827 bytes +257 bytes (+0.26%) +223 bytes
99797 bytes +227 bytes (+0.23%) +193 bytes
99688 bytes +118 bytes (+0.12%) +84 bytes
99677 bytes +107 bytes (+0.11%) +73 bytes
99704 bytes +134 bytes (+0.13%) +100 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 67932 bytes -31638 bytes (-31.77%)
RAR (proprietary) RAR rar a -m5 -md64m -mc63:128t -mt1 78206 bytes -21364 bytes (-21.46%)
PPMd (Wikipedia) 7zip 7za a -mx=9 -m0=ppmd 82514 bytes -17056 bytes (-17.13%)
Brotli (Wikipedia) brotli brotli -q 11 84892 bytes -14678 bytes (-14.74%)
LZMA2 (Wikipedia) xz xz -9 85528 bytes -14042 bytes (-14.10%)
Burrows-Wheeler transform (Wikipedia) bzip2 bzip2 -9 90896 bytes -8674 bytes (-8.71%)
Zstandard (Wikipedia) zstd zstd -19 91047 bytes -8523 bytes (-8.56%)

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.