Choose a version:
47% The original file has 463920 bytes (453.0k) and is available from the project website.
There you can find the official minified version, too, which brings down the size to 218926 bytes (213.8k, 47%).

After GZIP compression these minified files vary in size:
Boot
  84078 bytes (82.1k)
CDN, direct link
cdnjs
  74271 bytes (72.5k)
CDN, direct link
gzip -6 (default)
  73816 bytes (72.1k)
local copy
gzip -9
  73530 bytes (71.8k)
local copy
libdeflate -12
  70698 bytes (69.0k)
local copy
7zip -mx=9 -tgzip
  70304 bytes (68.7k)
local copy
kzip -s0 -rn -b7
  70103 bytes (68.5k)
local copy
pigz -11 -n
  69931 bytes (68.3k)
local copy
Zopfli
  69851 bytes (68.2k)
local copy
Zopfli (defluff)
  69850 bytes (68.2k)
local copy

perma-link to the smallest file on my server:
http://minime.stephan-brumme.com/files/d3/d3-4.9.1.min.js

You will automatically get the smallest D3 4.9.1 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 4420 bytes by using my D3 4.9.1 Zopfli version instead of the best available CDN (6.33% smaller than cdnjs, 69851 vs. 74271 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 --bsr16 --lazy --ohh

(found May 18, 2017)
Description Value Parameter
iterations 1000000  --i1000000
maximum blocks 8  --mb8
maximum length score 16  --mls16
block splitting recursion 16  --bsr16
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 (69850 bytes).

Verify file integrity

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

MD5:
curl --silent --compressed https://raw.githubusercontent.com/mbostock/d3/v4.9.1/d3.zip --location | md5sum
87a4fe17e65850362e6957560a708746  -
curl --silent --compressed http://minime.stephan-brumme.com/files/d3/d3-4.9.1.min.zopfli.js.gz | md5sum
87a4fe17e65850362e6957560a708746  -

SHA1:
curl --silent --compressed https://raw.githubusercontent.com/mbostock/d3/v4.9.1/d3.zip --location | sha1sum
d5b0fb8babc4b4c4234fc8a5063ee3f46a1603c6  -
curl --silent --compressed http://minime.stephan-brumme.com/files/d3/d3-4.9.1.min.zopfli.js.gz | sha1sum
d5b0fb8babc4b4c4234fc8a5063ee3f46a1603c6  -

All listed CDNs deliver identical contents:
CDN Size (compressed) MD5 (uncompressed) Timestamp
Boot 84078 bytes 87a4fe17e65850362e6957560a708746 May 19, 2017 @ 02:06
cdnjs 74271 bytes 87a4fe17e65850362e6957560a708746 May 16, 2017 @ 17:22

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

Other Versions

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

4.10.0,
4.9.1, 4.9.0, 4.8.0, 4.7.4, 4.7.3, 4.7.2, 4.7.1, 4.7.0, 4.6.0, 4.5.0, 4.4.4, 4.4.3, 4.4.2, 4.4.1, 4.4.0, 4.3.0, 4.2.8, 4.2.7, 4.2.6, 4.2.5, 4.2.4, 4.2.3, 4.2.2, 4.2.1, 4.2.0, 4.1.1, 4.1.0, 4.0.0,
3.5.17, 3.5.16, 3.5.15, 3.5.14, 3.5.13, 3.5.12, 3.5.11, 3.5.10, 3.5.9, 3.5.8, 3.5.7, 3.5.6, 3.5.5, 3.5.4, 3.5.3, 3.5.2, 3.5.1, 3.5.0, 3.4.13, 3.4.12, 3.4.11, 3.4.10, 3.4.9, 3.4.8, 3.4.6, 3.4.5, 3.4.4, 3.4.3, 3.4.2, 3.4.1, 3.4.0, 3.3.13, 3.3.12, 3.3.11, 3.3.10, 3.3.9, 3.3.8, 3.3.7, 3.3.6, 3.3.5, 3.3.4, 3.3.3, 3.3.2, 3.3.1, 3.3.0, 3.2.8, 3.2.7, 3.2.6, 3.2.5, 3.2.4, 3.2.3, 3.2.2, 3.2.1, 3.2.0, 3.1.10, 3.1.9, 3.1.8, 3.1.7, 3.1.6, 3.1.5, 3.1.4, 3.1.3, 3.1.2, 3.1.1, 3.1.0, 3.0.8, 3.0.7, 3.0.6, 3.0.5, 3.0.4, 3.0.3, 3.0.2, 3.0.1, 3.0.0

The project site contains an overview how well these versions were compressed.
Other interesting projects are AngularJS, BackboneJS, Bootstrap, Dojo, Ember, jQuery, Knockout, lodash, React, Socket.IO, ThreeJS, UnderscoreJS and Vue.

Changelog

Best Zopfli parameters so far:
Size Improvement Parameters Found
69851 bytes -3 bytes zopfli --i1000000 --mls16 --bsr16 --lazy --ohh May 18, 2017 @ 19:54
69854 bytes -1 byte zopfli --i100000 --mls16 --bsr16 --lazy --ohh May 18, 2017 @ 05:05
69855 bytes -5 bytes zopfli --i100000 --mls2 --bsr22 --lazy --ohh May 17, 2017 @ 23:40
69860 bytes -1 byte zopfli --i10000 --mls2 --bsr22 --lazy --ohh May 17, 2017 @ 20:07
69861 bytes -1 byte zopfli --i10000 --mls2 --bsr12 --lazy --ohh May 17, 2017 @ 19:56
69862 bytes -2 bytes zopfli --i10000 --mls16 --bsr16 --lazy --ohh May 17, 2017 @ 19:51
69864 bytes -3 bytes zopfli --i10000 --mls8 --bsr22 --lazy --ohh May 17, 2017 @ 19:45
69867 bytes -2 bytes zopfli --i1000 --mls2 --bsr21 --lazy --ohh May 17, 2017 @ 18:51
69869 bytes -21 bytes zopfli --i1000 --mls2 --bsr10 --lazy --ohh May 17, 2017 @ 18:51
69890 bytes zopfli --i100 --mls2 --bsr10 --lazy --ohh May 17, 2017 @ 18:40

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

Most recent activity on May 19, 2017 @ 02:06.

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
70220 70117 70211 70159 70159 70194 70190 70192 70102 70126 70102 70073 70094 70123 70134
70054 69936 70110 69952 69991 69954 69985 69957 69936 70026 70006 70050 70019 70025 70055
69951 69923 69915 69935 69941 70101 70025 69906 70016 70021 70013 70030 70020 70032 70040
69920 69923 69920 69920 70228 70058 70250 70100 70055 70007 70005 69976 70011 70028 70009
69871 69876 69923 69921 70077 70096 70062 70050 70040 70016 70036 70035 70047 70025 70028
69924 69881 69903 69920 70088 70099 70084 70063 70023 70007 69997 70003 70032 70030 70055
69864 69902 69919 70929 70085 70058 70041 70056 70027 70009 70020 69916 70031 70029 70004
69880 69881 69993 69883 70085 70047 70085 70056 70021 70009 69994 70006 70006 70029 70004
69856 69874 69902 69879 70087 70042 70145 70054 70021 70009 70009 70035 70025 70030 70039
69936 69926 69867 70032 70140 70073 70061 70061 70048 70020 70005 69870 70021 70030 70040
69877 69875 69908 69866 70086 70052 70012 70011 70055 70016 70008 70029 70033 70022 70038
69918 69958 69882 69920 70089 69995 70058 70057 70025 70015 70007 70021 70031 70026 70037
69942 69883 69866 69851 70097 70045 70021 70065 70024 70019 70006 70003 69999 70057 70008
69933 69873 69905 70096 70075 70131 70085 70061 70026 69983 70004 70028 70002 70042 70012
70018 70016 70040 69997 70099 70055 70072 70023 70028 69979 70001 70022 70035 70032 70038
69855 69865 69903 69996 70084 70082 70126 70022 70023 69974 70009 70022 70033 70061 70042
69921 69921 70002 70039 70075 70045 70056 70022 70024 69975 70007 70029 70035 70022 70039
69856 69871 69906 69918 70085 70084 70084 70057 70023 70005 70012 69893 70040 70030 70041
69855 69877 69864 69919 70085 70056 70020 70020 70019 70004 70005 70026 70030 70032 70004
69865 69875 69904 69919 70086 70086 70022 70022 70026 69973 70005 69912 70035 70032 70004
69865 69871 69906 69918 70057 70138 70092 70067 70020 69974 70025 70004 70017 70034 70040
69913 69904 69905 69920 70097 70112 70033 70027 70021 69978 70015 70005 70020 70026 70036
69864 69907 69922 69919 70070 70065 69996 70048 70060 69991 69980 69891 70017 70026 70019

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 69890 bytes 100%
1,000 69867 bytes -23 bytes 100%
10,000 69860 bytes -7 bytes 100%
100,000 69854 bytes -6 bytes 1.45%
1,000,000 69851 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
70109 bytes +258 bytes (+0.37%) +6 bytes
71443 bytes +1592 bytes (+2.28%) +1340 bytes
71114 bytes +1263 bytes (+1.81%) +1011 bytes
70235 bytes +384 bytes (+0.55%) +132 bytes
70111 bytes +260 bytes (+0.37%) +8 bytes
70124 bytes +273 bytes (+0.39%) +21 bytes
70141 bytes +290 bytes (+0.42%) +38 bytes
70103 bytes +252 bytes (+0.36%)
70112 bytes +261 bytes (+0.37%) +9 bytes

Non-DEFLATE Algorithms

Archivers based on completely different compression algorithms often produce superior results.
Unfortunately, browsers only support gzip compression at the moment.
Algorithm Program Parameters Size Compared To Best Zopfli
ZPAQ (Wikipedia) zpaq zpaq -method 69 54893 bytes -14958 bytes (-21.41%)
RAR (proprietary) RAR rar a -m5 -md64m -mc63:128t -mt1 60995 bytes -8856 bytes (-12.68%)
LZMA2 (Wikipedia) xz xz -9 61908 bytes -7943 bytes (-11.37%)
Brotli (Wikipedia) brotli brotli -q 11 62117 bytes -7734 bytes (-11.07%)
PPMd (Wikipedia) 7zip 7za a -mx=9 -m0=ppmd 63043 bytes -6808 bytes (-9.75%)
ZSTD (Wikipedia) zstd zstd -19 67416 bytes -2435 bytes (-3.49%)
Burrows-Wheeler transform (Wikipedia) bzip2 bzip2 -9 68626 bytes -1225 bytes (-1.75%)

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 2017.
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