diff --git a/package-lock.json b/package-lock.json index e634ee3cad10fa24fd8667f83fd20db358edb5f4..b358844154e359dba2b32d7288d449b6b896e233 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8503,6 +8503,38 @@ } } }, + "compression-webpack-plugin": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/compression-webpack-plugin/-/compression-webpack-plugin-7.1.2.tgz", + "integrity": "sha512-9DKNW6ILLjx+bNBoviHDgLx6swBhWWH9ApClC9sTH2NoFfQM47BapQfovCm9zjD9v1uZwInF5a925FB9ErGQeQ==", + "dev": true, + "requires": { + "schema-utils": "^3.0.0", + "serialize-javascript": "^5.0.1" + }, + "dependencies": { + "schema-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", + "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.6", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + }, + "serialize-javascript": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", + "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } + } + } + }, "compute-scroll-into-view": { "version": "1.0.17", "resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-1.0.17.tgz", @@ -11357,6 +11389,14 @@ } } }, + "express-static-gzip": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/express-static-gzip/-/express-static-gzip-2.1.1.tgz", + "integrity": "sha512-J+xSzdr5lj1cIuZey0ac6nUv22VE7GrdwTERqE8DsrqSXLm1zjeYWTVbK37t8exGwobxBXeWU2bM7eSMjBR4YA==", + "requires": { + "serve-static": "^1.14.1" + } + }, "expression-eval": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/expression-eval/-/expression-eval-2.1.0.tgz", diff --git a/package.json b/package.json index f8aaa0c092791eff75f674d480adcce18fce834a..66cdc9ee695b398a5a72632f870b636ea0410885 100644 --- a/package.json +++ b/package.json @@ -45,6 +45,7 @@ "dotenv": "^8.2.0", "express": "^4.16.4", "express-openapi-validator": "^3.12.7", + "express-static-gzip": "^2.1.1", "flat": "^5.0.2", "googleapis": "^71.0.0", "immutable": "^4.0.0-rc.12", @@ -98,6 +99,7 @@ "babel-jest": "^25.1.0", "babel-loader": "^8.2.2", "clean-webpack-plugin": "^3.0.0", + "compression-webpack-plugin": "^7.1.2", "concurrently": "^5.3.0", "copy-webpack-plugin": "^7.0.0", "cross-env": "^7.0.0", diff --git a/src/server/index.js b/src/server/index.js index 574503310e958bc42bfbddf8a559975b82e3c430..f0eb438158f3208d04fdd425b14ee23de56cbbbc 100644 --- a/src/server/index.js +++ b/src/server/index.js @@ -5,6 +5,7 @@ import path from 'path' import bodyParser from 'body-parser' import axios from 'axios' import { has, castArray } from 'lodash' +import expressStaticGzip from 'express-static-gzip' import { getResultCount, getPaginatedResults, @@ -45,7 +46,8 @@ let publicPath = null if (!isDevelopment) { // The root directory from which to serve static assets publicPath = path.join(__dirname, './../public/') - app.use(express.static(publicPath)) + // app.use(express.static(publicPath)) + app.use('/', expressStaticGzip(publicPath)) } // React app makes requests to these api urls diff --git a/webpack.client.prod.js b/webpack.client.prod.js index c6e5e909962320ba414807936eb0c06f366f6b73..b5533d686b3743e4b4e67f7bf6cb5d81017e82d8 100644 --- a/webpack.client.prod.js +++ b/webpack.client.prod.js @@ -1,6 +1,7 @@ const webpack = require('webpack') const { merge } = require('webpack-merge') const CopyPlugin = require('copy-webpack-plugin') +const CompressionPlugin = require('compression-webpack-plugin') const common = require('./webpack.client.common.js') module.exports = merge(common, { @@ -26,6 +27,9 @@ module.exports = merge(common, { to: `${common.output.path}` } ] + }), + new CompressionPlugin({ + test: /\.js(\?.*)?$/i }) ] })