From 555c593059ca525d0ca22549b2c4881c4973a56e Mon Sep 17 00:00:00 2001 From: Wyatt Johnson Date: Thu, 18 May 2017 11:08:46 -0600 Subject: [PATCH] Added gzip compression to bundle assets --- app.js | 10 ++++++++++ package.json | 2 ++ routes/index.js | 14 ++++++++++++-- webpack.config.js | 8 ++++++++ yarn.lock | 43 +++++++++++++++++++++++++++++++++++++++---- 5 files changed, 71 insertions(+), 6 deletions(-) diff --git a/app.js b/app.js index 9aca8b0ef..1ec1db78a 100644 --- a/app.js +++ b/app.js @@ -10,6 +10,7 @@ const enabled = require('debug').enabled; const errors = require('./errors'); const {createGraphOptions} = require('./graph'); const apollo = require('graphql-server-express'); +const accepts = require('accepts'); const app = express(); @@ -31,6 +32,15 @@ app.use(helmet({ frameguard: false })); app.use(bodyParser.json()); +app.get('*.js', (req, res, next) => { + const accept = accepts(req); + if (accept.encoding(['gzip']) === 'gzip') { + req.url = `${req.url}.gz`; + res.set('Content-Encoding', 'gzip'); + } + + next(); +}); app.use('/client', express.static(path.join(__dirname, 'dist'))); app.use('/public', express.static(path.join(__dirname, 'public'))); app.set('views', path.join(__dirname, 'views')); diff --git a/package.json b/package.json index fe7552414..76d822033 100644 --- a/package.json +++ b/package.json @@ -50,6 +50,7 @@ }, "homepage": "https://github.com/coralproject/talk#readme", "dependencies": { + "accepts": "^1.3.3", "app-module-path": "^2.2.0", "bcrypt": "^1.0.2", "body-parser": "^1.17.1", @@ -131,6 +132,7 @@ "chai-as-promised": "^6.0.0", "chai-http": "^3.0.0", "common-tags": "^1.4.0", + "compression-webpack-plugin": "^0.4.0", "copy-webpack-plugin": "^4.0.0", "css-loader": "^0.27.3", "dialog-polyfill": "^0.4.4", diff --git a/routes/index.js b/routes/index.js index 448bd6964..f1992e83d 100644 --- a/routes/index.js +++ b/routes/index.js @@ -8,8 +8,18 @@ const router = express.Router(); router.use('/api/v1', require('./api')); router.use('/admin', require('./admin')); router.use('/embed', require('./embed')); -router.get('/embed.js', (req, res) => res.sendFile(path.join(__dirname, '../dist/embed.js'))); -router.get('/embed.js.map', (req, res) => res.sendFile(path.join(__dirname, '../dist/embed.js.map'))); + +/** + * Serves a file based on a relative path. + */ +const serveFile = (filename) => (req, res) => res.sendFile(path.join(__dirname, filename)); + +/** + * Serves the embed javascript files. + */ +router.get('/embed.js', serveFile('../dist/embed.js')); +router.get('/embed.js.gz', serveFile('../dist/embed.js.gz')); +router.get('/embed.js.map', serveFile('../dist/embed.js.map')); if (process.env.NODE_ENV !== 'production') { router.use('/assets', require('./assets')); diff --git a/webpack.config.js b/webpack.config.js index 2d751f8b2..5072ec77a 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -1,5 +1,6 @@ const path = require('path'); const fs = require('fs'); +const CompressionPlugin = require('compression-webpack-plugin'); const autoprefixer = require('autoprefixer'); const precss = require('precss'); const Copy = require('copy-webpack-plugin'); @@ -145,6 +146,13 @@ module.exports = { }), new webpack.EnvironmentPlugin({ 'TALK_PLUGINS_JSON': '{}' + }), + new CompressionPlugin({ + asset: '[path].gz[query]', + algorithm: 'gzip', + test: /\.(js)$/, + threshold: 10240, + minRatio: 0.8 }) ], resolveLoader: { diff --git a/yarn.lock b/yarn.lock index ef1afebfc..3cbe44a2b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -67,7 +67,7 @@ abbrev@1, abbrev@1.0.x: version "1.0.9" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135" -accepts@~1.3.3: +accepts@^1.3.3, accepts@~1.3.3: version "1.3.3" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.3.tgz#c3ca7434938648c3e0d9c1e328dd68b622c284ca" dependencies: @@ -334,6 +334,10 @@ async-each@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" +async@0.2.x: + version "0.2.10" + resolved "https://registry.yarnpkg.com/async/-/async-0.2.10.tgz#b6bbe0b0674b9d719708ca38de8c237cb526c3d1" + async@1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/async/-/async-1.2.1.tgz#a4816a17cd5ff516dfa2c7698a453369b9790de0" @@ -1807,6 +1811,15 @@ component-emitter@^1.2.0: version "1.2.1" resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" +compression-webpack-plugin@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/compression-webpack-plugin/-/compression-webpack-plugin-0.4.0.tgz#811de04215f811ea6a12d4d8aed8457d758f13ac" + dependencies: + async "0.2.x" + webpack-sources "^0.1.0" + optionalDependencies: + node-zopfli "^2.0.0" + concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" @@ -2290,6 +2303,12 @@ default-require-extensions@^1.0.0: dependencies: strip-bom "^2.0.0" +defaults@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" + dependencies: + clone "^1.0.2" + define-properties@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.2.tgz#83a73f2fea569898fb737193c8f873caf6d45c94" @@ -5322,7 +5341,7 @@ mute-stream@0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" -nan@2.5.0, nan@^2.3.0, nan@^2.4.0: +nan@2.5.0, nan@^2.0.0, nan@^2.3.0, nan@^2.4.0: version "2.5.0" resolved "https://registry.yarnpkg.com/nan/-/nan-2.5.0.tgz#aa8f1e34531d807e9e27755b234b4a6ec0c152a8" @@ -5433,7 +5452,7 @@ node-libs-browser@^2.0.0: util "^0.10.3" vm-browserify "0.0.4" -node-pre-gyp@0.6.32, node-pre-gyp@^0.6.29: +node-pre-gyp@0.6.32, node-pre-gyp@^0.6.29, node-pre-gyp@^0.6.4: version "0.6.32" resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.32.tgz#fc452b376e7319b3d255f5f34853ef6fd8fe1fd5" dependencies: @@ -5461,6 +5480,15 @@ node-redis-warlock@~0.2.0: node-redis-scripty "0.0.5" uuid "^2.0.1" +node-zopfli@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/node-zopfli/-/node-zopfli-2.0.2.tgz#a7a473ae92aaea85d4c68d45bbf2c944c46116b8" + dependencies: + commander "^2.8.1" + defaults "^1.0.2" + nan "^2.0.0" + node-pre-gyp "^0.6.4" + nodemailer-direct-transport@3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/nodemailer-direct-transport/-/nodemailer-direct-transport-3.3.2.tgz#e96fafb90358560947e569017d97e60738a50a86" @@ -7508,7 +7536,7 @@ sort-keys@^1.0.0: dependencies: is-plain-obj "^1.0.0" -source-list-map@^0.1.7: +source-list-map@^0.1.7, source-list-map@~0.1.7: version "0.1.8" resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-0.1.8.tgz#c550b2ab5427f6b3f21f5afead88c4f5587b2106" @@ -8254,6 +8282,13 @@ webidl-conversions@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.1.tgz#8015a17ab83e7e1b311638486ace81da6ce206a0" +webpack-sources@^0.1.0: + version "0.1.5" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-0.1.5.tgz#aa1f3abf0f0d74db7111c40e500b84f966640750" + dependencies: + source-list-map "~0.1.7" + source-map "~0.5.3" + webpack-sources@^0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-0.2.3.tgz#17c62bfaf13c707f9d02c479e0dcdde8380697fb"