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

After GZIP compression these minified files vary in size:
unpkg
  182129 bytes (177.9k)
CDN
cdnjs
  147920 bytes (144.5k)
CDN
gzip -6 (default)
  146347 bytes (142.9k)
local copy
jsdelivr
  146312 bytes (142.9k)
CDN
gzip -9
  145800 bytes (142.4k)
local copy
libdeflate -12
  140917 bytes (137.6k)
local copy
zultra
  140832 bytes (137.5k)
local copy
7zip -mx=9 -tgzip
  140747 bytes (137.4k)
local copy
kzip -s0 -rn -b0
  140493 bytes (137.2k)
local copy
pigz -11 -n
  140475 bytes (137.2k)
local copy
Zopfli
  140410 bytes (137.1k)
local copy
Zopfli (defluff)
  140409 bytes (137.1k)
local copy

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

You will automatically get the smallest ThreeJS 108 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 5902 bytes by using my ThreeJS 108 Zopfli version instead of the best available CDN (4.20% smaller than jsdelivr, 140410 vs. 146312 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 --mls2048 --bsr12 --lazy --ohh

(found September 3, 2019)
Description Value Parameter
iterations 1000000  --i1000000
maximum blocks 8  --mb8
maximum length score 2048  --mls2048
block splitting recursion 12  --bsr12
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 1 more byte (140409 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/r108/build/three.min.js --location | md5sum
72fe423c0c63fb3f892d533dd88c491e  -
curl --silent --compressed https://minime.stephan-brumme.com/files/threejs/three-r108.min.zopfli.js.gz | md5sum
72fe423c0c63fb3f892d533dd88c491e  -

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

All listed CDNs deliver identical contents:
CDN Size (compressed) MD5 (uncompressed) Timestamp
unpkg 182129 bytes 72fe423c0c63fb3f892d533dd88c491e (invalid)
cdnjs 147920 bytes 72fe423c0c63fb3f892d533dd88c491e (invalid)
jsdelivr 146312 bytes 72fe423c0c63fb3f892d533dd88c491e August 29, 2019 @ 19:01

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
140410 bytes -8 bytes zopfli --i1000000 --mls2048 --bsr12 --lazy --ohh September 3, 2019 @ 16:39
140418 bytes -7 bytes zopfli --i100000 --mls2048 --bsr12 --lazy --ohh September 2, 2019 @ 15:06
140425 bytes -13 bytes zopfli --i10000 --mls2048 --bsr12 --lazy --ohh September 1, 2019 @ 01:36
140438 bytes -1 byte zopfli --i10000 --mls32 --bsr20 --lazy --ohh August 31, 2019 @ 05:27
140439 bytes -13 bytes zopfli --i1000 --mls2048 --bsr12 --lazy --ohh August 30, 2019 @ 01:06
140452 bytes -19 bytes zopfli --i1000 --mls32 --bsr20 --lazy --ohh August 29, 2019 @ 23:53
140471 bytes -3 bytes zopfli --i1000 --mls1024 --bsr19 --lazy --ohh August 29, 2019 @ 23:26
140474 bytes -1 byte zopfli --i1000 --mls1024 --bsr20 --lazy --ohh August 29, 2019 @ 22:12
140475 bytes zopfli --i100 --mls2048 --bsr12 --lazy --ohh August 29, 2019 @ 19: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:53.

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
140657 140638 140579 140606 140659 140704 140692 140678 140691 140653 140682 140626 140661 140638 140655
140556 140557 140567 140546 140593 140572 140579 140563 140541 140580 140541 140739 140554 140577 140572
140543 140549 140545 140548 140549 140536 140536 140539 140492 140549 140528 140572 140680 140519 140537
140600 140538 140602 140536 140594 140534 140553 140547 140585 140476 140465 140506 140600 140605 140594
140562 140557 140534 140541 140548 140542 140481 140594 140558 140476 140577 140555 140502 140499 140574
140538 140544 140546 140543 140544 140534 140522 140537 140526 140534 140541 140573 140581 140635 140597
140641 140580 140583 140532 140533 140560 140538 140540 140573 140529 140532 140512 140546 140649 140613
140546 140544 140551 140532 140497 140561 140502 140568 140524 140473 140503 140510 140612 140584 140586
140532 140533 140535 140541 140545 140542 140523 140509 140481 140473 140410 140507 140606 140503 140600
140551 140525 140545 140539 140539 140544 140535 140539 140514 140607 140531 140509 140607 140609 140548
140536 140534 140539 140532 140563 140535 140534 140531 140503 140503 140530 140479 140495 140509 140547
140574 140562 140537 140555 140555 140532 140487 140539 140492 140460 140464 140544 140607 140610 140584
140548 140536 140529 140471 140471 140589 140476 140538 140506 140471 140559 140515 140494 140533 140543
140535 140539 140550 140540 140553 140537 140537 140542 140539 140527 140537 140542 140611 140604 140588
140544 140561 140531 140555 140551 140545 140478 140538 140513 140498 140537 140510 140562 140475 140544
140535 140534 140536 140541 140485 140528 140500 140510 140505 140461 140504 140539 140598 140621 140589
140529 140523 140558 140542 140431 140534 140533 140506 140517 140460 140562 140502 140561 140506 140551
140576 140564 140532 140540 140551 140535 140536 140541 140531 140502 140540 140511 140581 140589 140590
140533 140539 140530 140530 140562 140533 140496 140540 140508 140495 140490 140607 140618 140508 140595
140560 140540 140540 140537 140488 140534 140499 140532 140504 140472 140537 140511 140584 140598 140553
140569 140565 140553 140531 140488 140537 140535 140529 140510 140477 140488 140513 140602 140600 140595
140539 140536 140539 140531 140544 140538 140483 140527 140462 140607 140469 140511 140601 140589 140554
140532 140534 140536 140535 140537 140533 140498 140506 140505 140598 140526 140538 140612 140622 140599

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 140475 bytes 100%
1,000 140439 bytes -36 bytes 100%
10,000 140425 bytes -14 bytes 100%
100,000 140418 bytes -7 bytes 0.58%
1,000,000 140410 bytes -8 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
140493 bytes +83 bytes (+0.06%)
141095 bytes +685 bytes (+0.49%) +602 bytes
141062 bytes +652 bytes (+0.46%) +569 bytes
140850 bytes +440 bytes (+0.31%) +357 bytes
140760 bytes +350 bytes (+0.25%) +267 bytes
140742 bytes +332 bytes (+0.24%) +249 bytes
140682 bytes +272 bytes (+0.19%) +189 bytes
140636 bytes +226 bytes (+0.16%) +143 bytes
140604 bytes +194 bytes (+0.14%) +111 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 94383 bytes -46027 bytes (-32.78%)
RAR (proprietary) RAR rar a -m5 -md64m -mc63:128t -mt1 108668 bytes -31742 bytes (-22.61%)
PPMd (Wikipedia) 7zip 7za a -mx=9 -m0=ppmd 114097 bytes -26313 bytes (-18.74%)
Brotli (Wikipedia) brotli brotli -q 11 119192 bytes -21218 bytes (-15.11%)
LZMA2 (Wikipedia) xz xz -9 119836 bytes -20574 bytes (-14.65%)
Burrows-Wheeler transform (Wikipedia) bzip2 bzip2 -9 125151 bytes -15259 bytes (-10.87%)
Zstandard (Wikipedia) zstd zstd -19 125775 bytes -14635 bytes (-10.42%)

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.