Skip to content

Commit cc2c7f0

Browse files
committed
Precompress and optimize static files during build and serve them to browsers
Closes #1030 Cherry-picked parts from 9ea280e
1 parent 6bb7f7a commit cc2c7f0

4 files changed

Lines changed: 72 additions & 9 deletions

File tree

package.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@
5858
"debug": "2.3.3",
5959
"element-resize-detector": "1.1.9",
6060
"express": "4.14.0",
61+
"express-static-gzip": "0.2.1",
6162
"fluxible": "1.2.0",
6263
"fluxible-addons-react": "0.2.8",
6364
"foundation-apps": "1.2.0",
@@ -109,6 +110,8 @@
109110
"babel-plugin-transform-react-remove-prop-types": "0.2.11",
110111
"babel-plugin-transform-runtime": "6.15.0",
111112
"babel-runtime": "6.18.0",
113+
"brotli-webpack-plugin": "0.1.1",
114+
"compression-webpack-plugin": "0.3.2",
112115
"css-loader": "0.26.1",
113116
"csswring": "5.1.0",
114117
"eslint": "3.11.1",

server/server.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ if (process.env.NODE_ENV === 'production') {
3131

3232
/* ********* Server **********/
3333
const express = require('express');
34+
const expressStaticGzip = require('express-static-gzip');
3435
const cookieParser = require('cookie-parser');
3536
const bodyParser = require('body-parser');
3637

@@ -43,7 +44,8 @@ function setUpStaticFolders() {
4344
const staticFolder = path.join(process.cwd(), '_static');
4445
// Sert cache for 1 week
4546
const oneDay = 86400000;
46-
app.use(config.APP_PATH, express.static(staticFolder, {
47+
app.use(config.APP_PATH, expressStaticGzip(staticFolder, {
48+
enableBrotli: true,
4749
maxAge: 30 * oneDay,
4850
setHeaders(res, reqPath) {
4951
if (

webpack.config.js

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ const StatsPlugin = require('stats-webpack-plugin');
1111
// const OptimizeJsPlugin = require('optimize-js-plugin');
1212
const OfflinePlugin = require('offline-plugin');
1313
const WebpackMd5Hash = require('webpack-md5-hash');
14+
const GzipCompressionPlugin = require('compression-webpack-plugin');
15+
const BrotliCompressionPlugin = require('brotli-webpack-plugin');
1416
const fs = require('fs');
1517

1618
require('babel-core/register')({
@@ -161,7 +163,7 @@ function getPluginsConfig(env) {
161163
names: ['common', 'leaflet', 'manifest'],
162164
}),
163165
new webpack.optimize.AggressiveMergingPlugin(),
164-
new webpack.optimize.MinChunkSizePlugin({ minChunkSize: 20000 }),
166+
new webpack.optimize.MinChunkSizePlugin({ minChunkSize: 60000 }),
165167
new StatsPlugin('../stats.json', { chunkModules: true }),
166168
new webpack.optimize.UglifyJsPlugin({
167169
sourceMap: true,
@@ -193,6 +195,17 @@ function getPluginsConfig(env) {
193195
},
194196
safeToUseOptionalCaches: true,
195197
}),
198+
new GzipCompressionPlugin({
199+
asset: '[path].gz[query]',
200+
algorithm: 'zopfli',
201+
test: /\.(js|css|html|svg)$/,
202+
minRatio: 0.95,
203+
}),
204+
new BrotliCompressionPlugin({
205+
asset: '[path].br[query]',
206+
test: /\.(js|css|html|svg)$/,
207+
minRatio: 0.95,
208+
}),
196209
new webpack.NoErrorsPlugin(),
197210
]);
198211
}

yarn.lock

Lines changed: 52 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -294,6 +294,10 @@ async-foreach@^0.1.3:
294294
version "0.1.3"
295295
resolved "https://registry.yarnpkg.com/async-foreach/-/async-foreach-0.1.3.tgz#36121f845c0578172de419a97dbeb1d16ec34542"
296296

297+
[email protected], async@~0.2.6:
298+
version "0.2.10"
299+
resolved "https://registry.yarnpkg.com/async/-/async-0.2.10.tgz#b6bbe0b0674b9d719708ca38de8c237cb526c3d1"
300+
297301
298302
version "2.0.0-rc.4"
299303
resolved "https://registry.yarnpkg.com/async/-/async-2.0.0-rc.4.tgz#9b7f60724c17962a973f787419e0ebc5571dbad8"
@@ -310,10 +314,6 @@ async@^1.4.0, async@^1.5.0, async@^1.5.2, async@~1.5.2:
310314
version "1.5.2"
311315
resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a"
312316

313-
async@~0.2.6:
314-
version "0.2.10"
315-
resolved "https://registry.yarnpkg.com/async/-/async-0.2.10.tgz#b6bbe0b0674b9d719708ca38de8c237cb526c3d1"
316-
317317
async@~0.9.0:
318318
version "0.9.2"
319319
resolved "https://registry.yarnpkg.com/async/-/async-0.9.2.tgz#aea74d5e61c1f899613bf64bda66d4c78f2fd17d"
@@ -1183,6 +1183,14 @@ brorand@^1.0.1:
11831183
version "1.0.6"
11841184
resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.0.6.tgz#4028706b915f91f7b349a2e0bf3c376039d216e5"
11851185

1186+
1187+
version "0.1.1"
1188+
resolved "https://registry.yarnpkg.com/brotli-webpack-plugin/-/brotli-webpack-plugin-0.1.1.tgz#a42bb2a4ac62d1972996edd46162cc900c275024"
1189+
dependencies:
1190+
async "0.2.x"
1191+
iltorb "^1.0.12"
1192+
webpack-sources "^0.1.0"
1193+
11861194
browser-pack@^6.0.1:
11871195
version "6.0.2"
11881196
resolved "https://registry.yarnpkg.com/browser-pack/-/browser-pack-6.0.2.tgz#f86cd6cef4f5300c8e63e07a4d512f65fbff4531"
@@ -1699,6 +1707,15 @@ compressible@~2.0.8:
16991707
dependencies:
17001708
mime-db ">= 1.24.0 < 2"
17011709

1710+
1711+
version "0.3.2"
1712+
resolved "https://registry.yarnpkg.com/compression-webpack-plugin/-/compression-webpack-plugin-0.3.2.tgz#1edfb0e749d7366d3e701670c463359b2c0cf704"
1713+
dependencies:
1714+
async "0.2.x"
1715+
webpack-sources "^0.1.0"
1716+
optionalDependencies:
1717+
node-zopfli "^2.0.0"
1718+
17021719
compression@^1.5.2:
17031720
version "1.6.2"
17041721
resolved "https://registry.yarnpkg.com/compression/-/compression-1.6.2.tgz#cceb121ecc9d09c52d7ad0c3350ea93ddd402bc3"
@@ -2063,6 +2080,12 @@ deep-is@~0.1.3:
20632080
version "0.1.3"
20642081
resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34"
20652082

2083+
defaults@^1.0.2:
2084+
version "1.0.3"
2085+
resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d"
2086+
dependencies:
2087+
clone "^1.0.2"
2088+
20662089
defined@^1.0.0:
20672090
version "1.0.0"
20682091
resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693"
@@ -2642,7 +2665,14 @@ [email protected]:
26422665
loader-utils "0.2.x"
26432666
source-map "0.1.x"
26442667

2645-
[email protected], express@^4.13.3, express@^4.4.4:
2668+
2669+
version "0.2.1"
2670+
resolved "https://registry.yarnpkg.com/express-static-gzip/-/express-static-gzip-0.2.1.tgz#c077d4501c7c07565d24f3ba382d1e7f9eb88f1b"
2671+
dependencies:
2672+
express "^4.14.0"
2673+
mime "^1.3.4"
2674+
2675+
[email protected], express@^4.13.3, express@^4.14.0, express@^4.4.4:
26462676
version "4.14.0"
26472677
resolved "https://registry.yarnpkg.com/express/-/express-4.14.0.tgz#c1ee3f42cdc891fb3dc650a8922d51ec847d0d66"
26482678
dependencies:
@@ -3651,6 +3681,12 @@ ignore@^3.2.0:
36513681
version "3.2.0"
36523682
resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.2.0.tgz#8d88f03c3002a0ac52114db25d2c673b0bf1e435"
36533683

3684+
iltorb@^1.0.12:
3685+
version "1.0.13"
3686+
resolved "https://registry.yarnpkg.com/iltorb/-/iltorb-1.0.13.tgz#9913538457bf39d3dac223ebb4d9990dbda1354f"
3687+
dependencies:
3688+
nan "^2.4.0"
3689+
36543690
36553691
version "0.6.5"
36563692
resolved "https://registry.yarnpkg.com/imports-loader/-/imports-loader-0.6.5.tgz#ae74653031d59e37b3c2fb2544ac61aeae3530a6"
@@ -4858,7 +4894,7 @@ [email protected]:
48584894
dependencies:
48594895
lru-cache "2.5.0"
48604896

4861-
nan@^2.0.4, nan@^2.3.0, nan@^2.3.2:
4897+
nan@^2.0.0, nan@^2.0.4, nan@^2.3.0, nan@^2.3.2, nan@^2.4.0:
48624898
version "2.4.0"
48634899
resolved "https://registry.yarnpkg.com/nan/-/nan-2.4.0.tgz#fb3c59d45fe4effe215f0b890f8adf6eb32d2232"
48644900

@@ -4957,7 +4993,7 @@ node-libs-browser@^1.0.0:
49574993
util "^0.10.3"
49584994
vm-browserify "0.0.4"
49594995

4960-
node-pre-gyp@^0.6.29:
4996+
node-pre-gyp@^0.6.29, node-pre-gyp@^0.6.4:
49614997
version "0.6.32"
49624998
resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.32.tgz#fc452b376e7319b3d255f5f34853ef6fd8fe1fd5"
49634999
dependencies:
@@ -4996,6 +5032,15 @@ node-uuid@~1.4.0, node-uuid@~1.4.7:
49965032
version "1.4.7"
49975033
resolved "https://registry.yarnpkg.com/node-uuid/-/node-uuid-1.4.7.tgz#6da5a17668c4b3dd59623bda11cf7fa4c1f60a6f"
49985034

5035+
node-zopfli@^2.0.0:
5036+
version "2.0.2"
5037+
resolved "https://registry.yarnpkg.com/node-zopfli/-/node-zopfli-2.0.2.tgz#a7a473ae92aaea85d4c68d45bbf2c944c46116b8"
5038+
dependencies:
5039+
commander "^2.8.1"
5040+
defaults "^1.0.2"
5041+
nan "^2.0.0"
5042+
node-pre-gyp "^0.6.4"
5043+
49995044
50005045
version "1.11.0"
50015046
resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-1.11.0.tgz#226c562bd2a7b13d3d7518b49ad4828a3623d06c"

0 commit comments

Comments
 (0)