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

After GZIP compression these minified files vary in size:
Boot
  37075 bytes (36.2k)
CDN
cdnjs
  30576 bytes (29.9k)
CDN
gzip -6 (default)
  20952 bytes (20.5k)
local copy
jsdelivr
  20871 bytes (20.4k)
CDN
gzip -9
  20862 bytes (20.4k)
local copy
7zip -mx=9 -tgzip
  20240 bytes (19.8k)
local copy
libdeflate -12
  20236 bytes (19.8k)
local copy
kzip -s0 -rn -b4
  20163 bytes (19.7k)
local copy
zultra
  20160 bytes (19.7k)
local copy
pigz -11 -n
  20124 bytes (19.7k)
local copy
Zopfli
  20087 bytes (19.6k)
local copy

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

You will automatically get the smallest lodash 4.2.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 784 bytes by using my lodash 4.2.1 Zopfli version instead of the best available CDN (3.90% smaller than jsdelivr, 20087 vs. 20871 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 --i100000 --mb8 --mls2 --bsr20 --lazy --ohh

(found April 13, 2016)
Description Value Parameter
iterations 100000  --i100000
maximum blocks 8  --mb8
maximum length score 2  --mls2
block splitting recursion 20  --bsr20
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://raw.githubusercontent.com/lodash/lodash/4.2.1/dist/lodash.min.js --location | md5sum
1179cd7af454306a142e355fd42e0efc  -
curl --silent --compressed https://minime.stephan-brumme.com/files/lodash/lodash-4.2.1.min.zopfli.js.gz | md5sum
1179cd7af454306a142e355fd42e0efc  -

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

These CDNs send you the original file:
CDN Size (compressed) MD5 (uncompressed) Timestamp
jsdelivr 20871 bytes 1179cd7af454306a142e355fd42e0efc (invalid)

And some CDNs send you a different file:
CDN Size (compressed) MD5 (uncompressed) Comment / Diff Timestamp
Boot 37075 bytes ad7db839dfb4577506df4cd483c72018 < /**
< * @license
< * lodash 4.2.1 (Custom Build) lodash.com/license | Unders [...]
< * Build: `lodash -o ./dist/lodash.js`
< */
< ;(function(){function n(n,t){return n.set(t[0],t[1]),n}fun [...]
< return true}function i(n,t){for(var r=-1,e=n.length,u=-1,o [...]
< var u=n.length;for(e&&u&&(r=n[--u]);u--;)r=t(r,n[u],u,n);r [...]
< return-1}function y(n,t,r,e,u){return u(n,function(n,u,o){ [...]
< return r}function E(n,t){for(var r=n.length;r--&&-1<d(t,n[ [...]
[...]
(invalid)
cdnjs 30576 bytes ad7db839dfb4577506df4cd483c72018 < /**
< * @license
< * lodash 4.2.1 (Custom Build) lodash.com/license | Unders [...]
< * Build: `lodash -o ./dist/lodash.js`
< */
< ;(function(){function n(n,t){return n.set(t[0],t[1]),n}fun [...]
< return true}function i(n,t){for(var r=-1,e=n.length,u=-1,o [...]
< var u=n.length;for(e&&u&&(r=n[--u]);u--;)r=t(r,n[u],u,n);r [...]
< return-1}function y(n,t,r,e,u){return u(n,function(n,u,o){ [...]
< return r}function E(n,t){for(var r=n.length;r--&&-1<d(t,n[ [...]
[...]
(invalid)

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

Other Versions

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

4.17.21, 4.17.20, 4.17.19, 4.17.18, 4.17.17, 4.17.16, 4.17.15, 4.17.14, 4.17.13, 4.17.12, 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
20087 bytes -1 byte zopfli --i100000 --mls2 --bsr20 --lazy --ohh April 13, 2016 @ 14:05
20088 bytes -1 byte zopfli --i100000 --mls256 --bsr11 --lazy --ohh April 13, 2016 @ 13:31
20089 bytes -3 bytes zopfli --i10000 --mls256 --bsr11 --lazy --ohh April 12, 2016 @ 09:55
20092 bytes -7 bytes zopfli --i1000 --mls256 --bsr11 --lazy --ohh April 12, 2016 @ 09:23
20099 bytes zopfli --i100 --mls256 --bsr11 --lazy --ohh April 12, 2016 @ 02:59

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

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 100,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
20125 20127 20127 20128 20141 20142 20142 20134 20124 20126 20132 20130 20117 20134 20138
20105 20096 20099 20101 20100 20102 20113 20107 20111 20101 20111 20118 20121 20098 20108
20095 20094 20093 20092 20096 20105 20101 20111 20109 20115 20108 20109 20106 20110 20099
20094 20094 20098 20095 20093 20094 20093 20101 20100 20108 20110 20109 20106 20098 20114
20092 20093 20101 20095 20093 20098 20112 20095 20100 20099 20094 20110 20109 20092 20103
20096 20101 20099 20103 20094 20099 20101 20098 20101 20100 20107 20109 20111 20114 20104
20087 20095 20104 20099 20093 20104 20094 20096 20099 20109 20108 20109 20107 20094 20099
20094 20093 20105 20092 20093 20100 20096 20088 20101 20099 20100 20112 20107 20096 20107
20094 20095 20091 20095 20094 20095 20101 20099 20100 20101 20100 20108 20108 20095 20099
20099 20094 20098 20093 20095 20095 20094 20092 20099 20100 20098 20108 20108 20092 20108
20094 20093 20100 20094 20093 20091 20094 20091 20098 20096 20098 20109 20107 20094 20097
20095 20093 20099 20091 20094 20097 20103 20099 20099 20096 20100 20108 20108 20093 20097
20095 20094 20100 20092 20093 20093 20096 20100 20100 20099 20099 20106 20108 20094 20099
20094 20093 20099 20091 20096 20092 20094 20095 20098 20099 20099 20108 20106 20094 20100
20096 20094 20099 20097 20093 20095 20101 20102 20101 20095 20093 20109 20108 20096 20100
20096 20094 20099 20092 20094 20096 20103 20099 20098 20100 20100 20112 20109 20096 20097
20087 20093 20101 20092 20093 20096 20097 20100 20099 20099 20108 20108 20108 20092 20099
20096 20094 20100 20092 20097 20097 20094 20099 20102 20099 20100 20108 20106 20091 20101
20094 20093 20105 20094 20091 20092 20096 20099 20100 20101 20109 20113 20110 20110 20106
20093 20092 20099 20092 20096 20100 20094 20099 20100 20097 20100 20109 20106 20091 20096
20095 20095 20100 20094 20094 20094 20105 20103 20100 20091 20097 20109 20105 20091 20098
20095 20094 20099 20092 20099 20092 20094 20100 20099 20099 20100 20112 20107 20094 20100
20095 20094 20100 20093 20091 20098 20095 20098 20101 20101 20103 20099 20106 20097 20099

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 20099 bytes 100%
1,000 20092 bytes -7 bytes 100%
10,000 20089 bytes -3 bytes 100%
100,000 20087 bytes -2 bytes 0.87%
1,000,000
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
20180 bytes +93 bytes (+0.46%) +17 bytes
20239 bytes +152 bytes (+0.76%) +76 bytes
20169 bytes +82 bytes (+0.41%) +6 bytes
20179 bytes +92 bytes (+0.46%) +16 bytes
20163 bytes +76 bytes (+0.38%)
20176 bytes +89 bytes (+0.44%) +13 bytes
20195 bytes +108 bytes (+0.54%) +32 bytes
20220 bytes +133 bytes (+0.66%) +57 bytes
20233 bytes +146 bytes (+0.73%) +70 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 17081 bytes -3006 bytes (-14.96%)
RAR (proprietary) RAR rar a -m5 -md64m -mc63:128t -mt1 17362 bytes -2725 bytes (-13.57%)
PPMd (Wikipedia) 7zip 7za a -mx=9 -m0=ppmd 18418 bytes -1669 bytes (-8.31%)
Brotli (Wikipedia) brotli brotli -q 11 18943 bytes -1144 bytes (-5.70%)
LZMA2 (Wikipedia) xz xz -9 19356 bytes -731 bytes (-3.64%)
Burrows-Wheeler transform (Wikipedia) bzip2 bzip2 -9 19492 bytes -595 bytes (-2.96%)
Zstandard (Wikipedia) zstd zstd -19 19981 bytes -106 bytes (-0.53%)

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.