Choose a version:
22% The original file has 659291 bytes (643.8k) and is available from the project website.
There you can find the official minified version, too, which brings down the size to 146648 bytes (143.2k, 22%).

After GZIP compression these minified files vary in size:
Boot
  50975 bytes (49.8k)
CDN
jsdelivr
  50975 bytes (49.8k)
CDN
cdnjs
  43636 bytes (42.6k)
CDN
unpkg
  43223 bytes (42.2k)
CDN
gzip -6 (default)
  43199 bytes (42.2k)
local copy
gzip -9
  43021 bytes (42.0k)
local copy
7zip -mx=9 -tgzip
  41590 bytes (40.6k)
local copy
zultra
  41586 bytes (40.6k)
local copy
libdeflate -12
  41584 bytes (40.6k)
local copy
kzip -s0 -rn -b7
  41502 bytes (40.5k)
local copy
pigz -11 -n
  41470 bytes (40.5k)
local copy
Zopfli
  41320 bytes (40.4k)
local copy

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

You will automatically get the smallest React 15.0.2 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 1903 bytes by using my React 15.0.2 Zopfli version instead of the best available CDN (4.61% smaller than unpkg, 41320 vs. 43223 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 --mls128 --bsr12 --lazy --ohh

(found May 2, 2016)
Description Value Parameter
iterations 1000000  --i1000000
maximum blocks 8  --mb8
maximum length score 128  --mls128
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

Verify file integrity

After decompression, my uncompressed files are identical to the original ones:

MD5:
curl --silent --compressed https://fb.me/react-15.0.2.min.js --location | md5sum
543c9a74582d06071b2793b237064ade  -
curl --silent --compressed https://minime.stephan-brumme.com/files/react/react-15.0.2.min.zopfli.js.gz | md5sum
543c9a74582d06071b2793b237064ade  -

SHA1:
curl --silent --compressed https://fb.me/react-15.0.2.min.js --location | sha1sum
5f2b4ec20bc9f4509fe8112b2fd0dbf517116094  -
curl --silent --compressed https://minime.stephan-brumme.com/files/react/react-15.0.2.min.zopfli.js.gz | sha1sum
5f2b4ec20bc9f4509fe8112b2fd0dbf517116094  -

All listed CDNs deliver identical contents:
CDN Size (compressed) MD5 (uncompressed) Timestamp
Boot 50975 bytes 543c9a74582d06071b2793b237064ade May 6, 2016 @ 13:19
jsdelivr 50975 bytes 543c9a74582d06071b2793b237064ade April 30, 2016 @ 03:04
cdnjs 43636 bytes 543c9a74582d06071b2793b237064ade April 30, 2016 @ 03:01
unpkg 43223 bytes 543c9a74582d06071b2793b237064ade July 11, 2016 @ 15:32

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

Other Versions

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

18.2.0,
18.1.0, 18.0.0,
17.0.2, 17.0.1, 17.0.0,
16.14.0,
16.13.1, 16.13.0,
16.12.0,
16.11.0,
16.10.2, 16.10.1, 16.10.0,
16.9.0,
16.8.6, 16.8.5, 16.8.4, 16.8.3, 16.8.2, 16.8.1, 16.8.0,
16.7.0,
16.6.3, 16.6.1, 16.6.0,
16.5.2, 16.5.1, 16.5.0,
16.4.2, 16.4.1, 16.4.0,
16.3.2, 16.3.1, 16.3.0,
16.2.0,
16.1.1, 16.1.0, 16.0.0,
15.6.2, 15.6.1, 15.6.0,
15.5.2, 15.5.1, 15.5.0,
15.4.2, 15.4.1, 15.4.0,
15.3.2, 15.3.1, 15.3.0,
15.2.1, 15.2.0,
15.1.0,
15.0.2, 15.0.1, 15.0.0,
0.14.8, 0.14.7, 0.14.6, 0.14.5, 0.14.4, 0.14.3, 0.14.2, 0.14.1, 0.14.0,
0.13.3, 0.13.2, 0.13.1, 0.13.0,
0.12.2, 0.12.1, 0.12.0,
0.11.2, 0.11.1, 0.11.0,
0.10.0

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, Socket.IO, ThreeJS, UnderscoreJS and Vue.

Changelog

Best Zopfli parameters so far:
Size Improvement Parameters Found
41320 bytes -4 bytes zopfli --i1000000 --mls128 --bsr12 --lazy --ohh May 2, 2016 @ 18:29
41324 bytes -5 bytes zopfli --i100000 --mls128 --bsr12 --lazy --ohh May 2, 2016 @ 09:35
41329 bytes -8 bytes zopfli --i10000 --mls128 --bsr12 --lazy --ohh May 1, 2016 @ 00:00
41337 bytes -21 bytes zopfli --i1000 --mls128 --bsr12 --lazy --ohh April 30, 2016 @ 23:56
41358 bytes zopfli --i100 --mls128 --bsr12 --lazy --ohh April 30, 2016 @ 23: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:50.

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
41469 41466 41471 41535 41534 41534 41533 41532 41534 41534 41534 41531 41542 41550 41549
41380 41395 41384 41394 41426 41386 41443 41446 41453 41447 41355 41531 41363 41363 41404
41363 41357 41446 41449 41449 41444 41431 41436 41438 41536 41541 41532 41549 41365 41380
41367 41365 41443 41445 41438 41439 41440 41531 41533 41528 41529 41531 41539 41539 41355
41360 41359 41359 41349 41359 41360 41353 41351 41356 41352 41349 41531 41361 41361 41379
41443 41443 41438 41447 41445 41442 41444 41445 41443 41440 41351 41530 41539 41362 41373
41359 41364 41441 41442 41440 41440 41437 41438 41442 41350 41530 41531 41539 41539 41538
41354 41357 41364 41352 41357 41361 41350 41352 41355 41351 41351 41530 41538 41359 41356
41360 41355 41363 41359 41338 41351 41320 41351 41352 41351 41348 41532 41360 41359 41355
41447 41445 41441 41441 41440 41432 41435 41433 41437 41530 41530 41530 41540 41361 41360
41448 41448 41445 41356 41357 41442 41350 41364 41441 41353 41352 41530 41543 41374 41362
41352 41357 41364 41362 41356 41360 41355 41350 41352 41367 41365 41531 41364 41363 41366
41356 41360 41359 41360 41356 41356 41353 41355 41350 41350 41347 41531 41364 41373 41353
41361 41366 41362 41356 41334 41356 41329 41359 41356 41350 41348 41530 41363 41356 41360
41453 41444 41441 41360 41337 41354 41439 41354 41446 41351 41349 41531 41361 41368 41354
41364 41357 41361 41445 41441 41356 41352 41440 41359 41348 41357 41531 41360 41362 41375
41358 41360 41363 41447 41450 41442 41439 41435 41354 41351 41530 41531 41540 41361 41374
41363 41362 41361 41353 41357 41340 41354 41350 41440 41352 41359 41531 41358 41357 41360
41363 41446 41361 41356 41340 41357 41349 41347 41361 41349 41354 41531 41359 41360 41365
41362 41353 41354 41358 41338 41348 41356 41355 41360 41361 41347 41531 41540 41360 41357
41446 41447 41359 41364 41436 41355 41357 41351 41357 41351 41349 41531 41364 41363 41373
41365 41361 41361 41367 41343 41352 41350 41350 41351 41351 41354 41531 41360 41372 41372
41364 41357 41362 41341 41338 41350 41347 41353 41351 41352 41349 41531 41365 41368 41356

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 41358 bytes 100%
1,000 41337 bytes -21 bytes 100%
10,000 41329 bytes -8 bytes 100%
100,000 41324 bytes -5 bytes 0.87%
1,000,000 41320 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
41633 bytes +313 bytes (+0.76%) +131 bytes
41626 bytes +306 bytes (+0.74%) +124 bytes
41636 bytes +316 bytes (+0.76%) +134 bytes
41568 bytes +248 bytes (+0.60%) +66 bytes
41532 bytes +212 bytes (+0.51%) +30 bytes
41536 bytes +216 bytes (+0.52%) +34 bytes
41517 bytes +197 bytes (+0.48%) +15 bytes
41502 bytes +182 bytes (+0.44%)
41523 bytes +203 bytes (+0.49%) +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 30278 bytes -11042 bytes (-26.72%)
RAR (proprietary) RAR rar a -m5 -md64m -mc63:128t -mt1 32747 bytes -8573 bytes (-20.75%)
PPMd (Wikipedia) 7zip 7za a -mx=9 -m0=ppmd 34938 bytes -6382 bytes (-15.45%)
Brotli (Wikipedia) brotli brotli -q 11 36421 bytes -4899 bytes (-11.86%)
Burrows-Wheeler transform (Wikipedia) bzip2 bzip2 -9 37021 bytes -4299 bytes (-10.40%)
LZMA2 (Wikipedia) xz xz -9 37624 bytes -3696 bytes (-8.94%)
Zstandard (Wikipedia) zstd zstd -19 39273 bytes -2047 bytes (-4.95%)

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.