Choose a version:
14% The original file has 538946 bytes (526.3k) and is available from the project website.
There you can find the official minified version, too, which brings down the size to 72779 bytes (71.1k, 14%).

After GZIP compression these minified files vary in size:
Boot
  28744 bytes (28.1k)
CDN
cdnjs
  25622 bytes (25.0k)
CDN
cdnhttps
  25398 bytes (24.8k)
CDN
unpkg
  24298 bytes (23.7k)
CDN
gzip -6 (default)
  24275 bytes (23.7k)
local copy
jsdelivr
  24208 bytes (23.6k)
CDN
gzip -9
  24201 bytes (23.6k)
local copy
7zip -mx=9 -tgzip
  23378 bytes (22.8k)
local copy
libdeflate -12
  23352 bytes (22.8k)
local copy
kzip -s0 -rn -b3
  23279 bytes (22.7k)
local copy
pigz -11 -n
  23249 bytes (22.7k)
local copy
Zopfli
  23213 bytes (22.7k)
local copy
Zopfli (defluff)
  23212 bytes (22.7k)
local copy

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

You will automatically get the smallest lodash 4.17.0 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 995 bytes by using my lodash 4.17.0 Zopfli version instead of the best available CDN (4.29% smaller than jsdelivr, 23213 vs. 24208 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 --mls2 --bsr40 --lazy --ohh

(found November 14, 2016)
Description Value Parameter
iterations 1000000  --i1000000
maximum blocks 8  --mb8
maximum length score 2  --mls2
block splitting recursion 40  --bsr40
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 (23212 bytes).

Verify file integrity

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

MD5:
curl --silent --compressed https://raw.githubusercontent.com/lodash/lodash/4.17.0/dist/lodash.min.js --location | md5sum
b5663c28f18e04831e8a96e8e17eb849  -
curl --silent --compressed https://minime.stephan-brumme.com/files/lodash/lodash-4.17.0.min.zopfli.js.gz | md5sum
b5663c28f18e04831e8a96e8e17eb849  -

SHA1:
curl --silent --compressed https://raw.githubusercontent.com/lodash/lodash/4.17.0/dist/lodash.min.js --location | sha1sum
199a6a8cbc8f166c4ab24b9e18aaed4b987e0ed1  -
curl --silent --compressed https://minime.stephan-brumme.com/files/lodash/lodash-4.17.0.min.zopfli.js.gz | sha1sum
199a6a8cbc8f166c4ab24b9e18aaed4b987e0ed1  -

These CDNs send you the original file:
CDN Size (compressed) MD5 (uncompressed) Timestamp
unpkg 24298 bytes b5663c28f18e04831e8a96e8e17eb849 November 14, 2016 @ 10:57
jsdelivr 24208 bytes b5663c28f18e04831e8a96e8e17eb849 (invalid)

And some CDNs send you a different file:
CDN Size (compressed) MD5 (uncompressed) Comment / Diff Timestamp
Boot 28744 bytes 2d0b9db73eb24a4e42c8a2f641dcbb0b < /**
< * @license
< * Lodash lodash.com/license | Underscore.js 1.8.3 undersc [...]
< */
< ;(function(){function n(n,t){return n.set(t[0],t[1]),n}fun [...]
< return n}function o(n,t){for(var r=-1,e=null==n?0:n.length [...]
< return n}function h(n,t,r,e){var u=-1,i=null==n?0:n.length [...]
< --r;for(var e=n.length;++r<e;)if(n[r]===t){n=r;break n}n=- [...]
< return n}function k(n,t){for(var r,e=-1,u=n.length;++e<u;) [...]
< return"\\"+Tn[n]}function L(n){var t=-1,r=Array(n.size);re [...]
[...]
(invalid)
cdnjs 25622 bytes 2d0b9db73eb24a4e42c8a2f641dcbb0b < /**
< * @license
< * Lodash lodash.com/license | Underscore.js 1.8.3 undersc [...]
< */
< ;(function(){function n(n,t){return n.set(t[0],t[1]),n}fun [...]
< return n}function o(n,t){for(var r=-1,e=null==n?0:n.length [...]
< return n}function h(n,t,r,e){var u=-1,i=null==n?0:n.length [...]
< --r;for(var e=n.length;++r<e;)if(n[r]===t){n=r;break n}n=- [...]
< return n}function k(n,t){for(var r,e=-1,u=n.length;++e<u;) [...]
< return"\\"+Tn[n]}function L(n){var t=-1,r=Array(n.size);re [...]
[...]
(invalid)
cdnhttps 25398 bytes 2d0b9db73eb24a4e42c8a2f641dcbb0b < /**
< * @license
< * Lodash lodash.com/license | Underscore.js 1.8.3 undersc [...]
< */
< ;(function(){function n(n,t){return n.set(t[0],t[1]),n}fun [...]
< return n}function o(n,t){for(var r=-1,e=null==n?0:n.length [...]
< return n}function h(n,t,r,e){var u=-1,i=null==n?0:n.length [...]
< --r;for(var e=n.length;++r<e;)if(n[r]===t){n=r;break n}n=- [...]
< return n}function k(n,t){for(var r,e=-1,u=n.length;++e<u;) [...]
< return"\\"+Tn[n]}function L(n){var t=-1,r=Array(n.size);re [...]
[...]
November 22, 2016 @ 16:35

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

Other Versions

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

4.17.11, 4.17.10, 4.17.9, 4.17.5, 4.17.4, 4.17.3, 4.17.2, 4.17.1, 4.17.0, 4.16.6, 4.16.5, 4.16.4, 4.16.3, 4.16.2, 4.16.1, 4.16.0, 4.15.0, 4.14.2, 4.14.1, 4.14.0, 4.13.1, 4.13.0, 4.12.0, 4.11.2, 4.11.1, 4.11.0, 4.10.0,
4.9.0, 4.8.2, 4.8.1, 4.8.0, 4.7.0, 4.6.1, 4.6.0, 4.5.1, 4.5.0, 4.4.0, 4.3.0, 4.2.1, 4.2.0, 4.1.0, 4.0.1, 4.0.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, React, Socket.IO, ThreeJS, UnderscoreJS and Vue.

Changelog

Best Zopfli parameters so far:
Size Improvement Parameters Found
23213 bytes -1 byte zopfli --i1000000 --mls2 --bsr40 --lazy --ohh November 14, 2016 @ 18:32
23214 bytes -1 byte zopfli --i10000 --mls2 --bsr40 --lazy --ohh November 14, 2016 @ 11:31
23215 bytes -3 bytes zopfli --i10000 --mls1024 --bsr7 --lazy --ohh November 14, 2016 @ 11:11
23218 bytes -8 bytes zopfli --i1000 --mls1024 --bsr7 --lazy --ohh November 14, 2016 @ 11:01
23226 bytes zopfli --i100 --mls1024 --bsr7 --lazy --ohh November 14, 2016 @ 10:58

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

Most recent activity on January 25, 2017 @ 15:26.

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
23271 23274 23268 23268 23260 23263 23258 23261 23260 23261 23266 23261 23260 23280 23271
23256 23253 23251 23287 23259 23240 23260 23239 23239 23241 23242 23247 23239 23252 23244
23227 23243 23223 23228 23230 23230 23230 23227 23226 23229 23240 23229 23230 23227 23244
23218 23224 23230 23227 23259 23227 23235 23234 23243 23213 23229 23228 23235 23241 23226
23227 23227 23227 23228 23235 23245 23231 23239 23234 23246 23230 23233 23231 23242 23239
23226 23227 23226 23224 23237 23245 23235 23251 23234 23220 23225 23228 23244 23242 23226
23228 23227 23227 23225 23237 23233 23239 23237 23236 23236 23229 23232 23219 23224 23215
23225 23213 23229 23225 23230 23230 23219 23229 23233 23216 23243 23244 23244 23241 23226
23220 23227 23227 23224 23255 23230 23229 23235 23232 23223 23228 23225 23227 23243 23226
23224 23218 23228 23226 23235 23229 23233 23242 23234 23226 23232 23228 23226 23241 23226
23226 23213 23227 23225 23236 23231 23226 23231 23232 23216 23229 23228 23235 23223 23237
23213 23219 23227 23228 23234 23230 23235 23238 23232 23215 23216 23228 23234 23241 23233
23226 23225 23227 23227 23233 23228 23225 23249 23224 23224 23229 23232 23225 23244 23238
23218 23227 23227 23225 23233 23229 23231 23230 23235 23226 23217 23228 23243 23241 23234
23226 23225 23227 23225 23238 23232 23229 23237 23235 23218 23213 23229 23228 23241 23227
23229 23230 23226 23234 23236 23230 23230 23227 23222 23219 23233 23226 23242 23245 23225
23218 23227 23228 23225 23237 23231 23234 23234 23235 23216 23216 23227 23227 23241 23225
23225 23228 23231 23227 23233 23231 23229 23229 23236 23222 23238 23226 23225 23242 23226
23226 23224 23226 23227 23232 23229 23218 23227 23232 23218 23231 23228 23225 23241 23226
23227 23226 23227 23225 23238 23230 23236 23236 23233 23221 23213 23229 23228 23241 23226
23225 23225 23226 23264 23232 23230 23218 23237 23232 23215 23228 23228 23226 23241 23224
23221 23224 23229 23224 23238 23231 23231 23236 23220 23216 23229 23228 23225 23242 23240
23213 23218 23228 23224 23237 23230 23230 23238 23234 23225 23230 23226 23227 23227 23242

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 23226 bytes 100%
1,000 23218 bytes -8 bytes 100%
10,000 23214 bytes -4 bytes 100%
100,000 23214 bytes 4.93%
1,000,000 23213 bytes -1 byte 2.03%
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
23314 bytes +101 bytes (+0.44%) +35 bytes
23467 bytes +254 bytes (+1.09%) +188 bytes
23346 bytes +133 bytes (+0.57%) +67 bytes
23279 bytes +66 bytes (+0.28%)
23301 bytes +88 bytes (+0.38%) +22 bytes
23304 bytes +91 bytes (+0.39%) +25 bytes
23307 bytes +94 bytes (+0.40%) +28 bytes
23327 bytes +114 bytes (+0.49%) +48 bytes
23354 bytes +141 bytes (+0.61%) +75 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 19500 bytes -3713 bytes (-16.00%)
RAR (proprietary) RAR rar a -m5 -md64m -mc63:128t -mt1 20144 bytes -3069 bytes (-13.22%)
PPMd (Wikipedia) 7zip 7za a -mx=9 -m0=ppmd 20957 bytes -2256 bytes (-9.72%)
Brotli (Wikipedia) brotli brotli -q 11 21684 bytes -1529 bytes (-6.59%)
LZMA2 (Wikipedia) xz xz -9 22204 bytes -1009 bytes (-4.35%)
Burrows-Wheeler transform (Wikipedia) bzip2 bzip2 -9 22545 bytes -668 bytes (-2.88%)
Zstandard (Wikipedia) zstd zstd -19 23081 bytes -132 bytes (-0.57%)

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