diff --git a/package-lock.json b/package-lock.json index 310959134..6a4682076 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1376,6 +1376,12 @@ "integrity": "sha512-HJ7CfNHrfJLlNTzIEUTj43LNWGkqpRLxm3YjAlcD0ACydk9XynzYsCBHxut+iqt+1aBXkx9UP/w/ZqMr13XIzg==", "dev": true }, + "acorn-walk": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.1.1.tgz", + "integrity": "sha512-OtUw6JUTgxA2QoqqmrmQ7F2NYqiBPi/L2jqHyFtllhOUvXYQXf0Z1CYUinIfyT4bTCGmrA7gX9FvHA81uzCoVw==", + "dev": true + }, "after": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", @@ -2099,6 +2105,18 @@ "callsite": "1.0.0" } }, + "bfj": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/bfj/-/bfj-6.1.1.tgz", + "integrity": "sha512-+GUNvzHR4nRyGybQc2WpNJL4MJazMuvf92ueIyA0bIkPRwhhQu3IfZQ2PSoVPpCBJfmoSdOxu5rnotfFLlvYRQ==", + "dev": true, + "requires": { + "bluebird": "3.5.1", + "check-types": "7.4.0", + "hoopy": "0.1.4", + "tryer": "1.0.1" + } + }, "big.js": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", @@ -2653,6 +2671,12 @@ "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", "dev": true }, + "check-types": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/check-types/-/check-types-7.4.0.tgz", + "integrity": "sha512-YbulWHdfP99UfZ73NcUDlNJhEIDgm9Doq9GhpyXbF+7Aegi3CVV7qqMCKTTqJxlvEvnQBp9IA+dxsGN6xK/nSg==", + "dev": true + }, "chokidar": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.5.tgz", @@ -3019,6 +3043,20 @@ } } }, + "compression-webpack-plugin": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/compression-webpack-plugin/-/compression-webpack-plugin-2.0.0.tgz", + "integrity": "sha512-bDgd7oTUZC8EkRx8j0sjyCfeiO+e5sFcfgaFcjVhfQf5lLya7oY2BczxcJ7IUuVjz5m6fy8IECFmVFew3xLk8Q==", + "dev": true, + "requires": { + "cacache": "11.3.2", + "find-cache-dir": "2.1.0", + "neo-async": "2.6.0", + "schema-utils": "1.0.0", + "serialize-javascript": "1.6.1", + "webpack-sources": "1.3.0" + } + }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -4115,6 +4153,12 @@ } } }, + "duplexer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", + "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", + "dev": true + }, "duplexify": { "version": "3.7.1", "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", @@ -4163,6 +4207,12 @@ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", "dev": true }, + "ejs": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.6.1.tgz", + "integrity": "sha512-0xy4A/twfrRCnkhfk8ErDi5DqdAsAqeGxht4xkCUrsvhhbQNs7E+4jV0CN7+NKIY0aHE72+XvqtBIXzD31ZbXQ==", + "dev": true + }, "electron-to-chromium": { "version": "1.3.124", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.124.tgz", @@ -5370,6 +5420,12 @@ "minimatch": "3.0.4" } }, + "filesize": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-3.6.1.tgz", + "integrity": "sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg==", + "dev": true + }, "fill-range": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", @@ -6664,6 +6720,24 @@ "integrity": "sha1-pCdO6zL6dl2lp6OxcSYXzjsUQUk=", "dev": true }, + "gzip-size": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-5.1.0.tgz", + "integrity": "sha512-wfSnvypBDRW94v5W3ckvvz/zFUNdJ81VgOP6tE4bPpRUcc0wGqU+y0eZjJEvKxwubJFix6P84sE8M51YWLT7rQ==", + "dev": true, + "requires": { + "duplexer": "0.1.1", + "pify": "4.0.1" + }, + "dependencies": { + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + } + } + }, "hammerjs": { "version": "2.0.8", "resolved": "https://registry.npmjs.org/hammerjs/-/hammerjs-2.0.8.tgz", @@ -6870,6 +6944,12 @@ "integrity": "sha1-uDT3I8xKJCqmWWNFnfbZhMXT2Vk=", "dev": true }, + "hoopy": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz", + "integrity": "sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==", + "dev": true + }, "hosted-git-info": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.6.0.tgz", @@ -15258,6 +15338,12 @@ } } }, + "tryer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz", + "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==", + "dev": true + }, "ts-loader": { "version": "5.3.3", "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-5.3.3.tgz", @@ -16056,6 +16142,79 @@ } } }, + "webpack-bundle-analyzer": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.3.2.tgz", + "integrity": "sha512-7qvJLPKB4rRWZGjVp5U1KEjwutbDHSKboAl0IfafnrdXMrgC0tOtZbQD6Rw0u4cmpgRN4O02Fc0t8eAT+FgGzA==", + "dev": true, + "requires": { + "acorn": "6.1.1", + "acorn-walk": "6.1.1", + "bfj": "6.1.1", + "chalk": "2.4.2", + "commander": "2.20.0", + "ejs": "2.6.1", + "express": "4.16.4", + "filesize": "3.6.1", + "gzip-size": "5.1.0", + "lodash": "4.17.10", + "mkdirp": "0.5.1", + "opener": "1.5.1", + "ws": "6.2.1" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "1.9.3" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.5.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "opener": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.1.tgz", + "integrity": "sha512-goYSy5c2UXE4Ra1xixabeVh1guIX/ZV/YokJksb6q2lubWu6UbvPQ20p542/sFIll1nl8JnCyK9oBaOcCWXwvA==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "3.0.0" + } + }, + "ws": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", + "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", + "dev": true, + "requires": { + "async-limiter": "1.0.0" + } + } + } + }, "webpack-cli": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.3.0.tgz", diff --git a/package.json b/package.json index 3c119a821..348215afd 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,7 @@ "name": "nifi-fds", "version": "0.1.0", "scripts": { - "start": "./node_modules/http-server/bin/http-server -p 28080 .", + "start": "./node_modules/http-server/bin/http-server --gzip -p 28080 .", "build:webapp:bundle:development": "npm run webpack:development", "build:webapp:bundle:production": "npm run webpack:production", "clean:install": "bash ./scripts/clean-install", @@ -27,8 +27,9 @@ "test": "karma start karma.conf.js --single-run", "test:dev": "karma start karma.conf.js", "watch": "npm run webpack:development && ./node_modules/.bin/webpack-dev-server --config webpack.dev.js", + "webpack:analyze": "./node_modules/.bin/webpack-bundle-analyzer webpack-build-log.json ./", "webpack:development": "./node_modules/.bin/webpack --config webpack.dev.js", - "webpack:production": "npm run lint && ./node_modules/.bin/webpack --config webpack.prod.js", + "webpack:production": "npm run lint && ./node_modules/.bin/webpack --config webpack.prod.js --json --progress --profile > webpack-build-log.json", "eslint": "./node_modules/.bin/eslint './webapp/**/*.js' './platform/**/*.js'", "stylelint": "./node_modules/.bin/stylelint './webapp/theming/**/*.scss' './platform/**/*.scss'", "lint": "npm run eslint && npm run stylelint" @@ -91,6 +92,7 @@ "babel-loader": "8.0.5", "babel-polyfill": "6.26.0", "cache-loader": "2.0.1", + "compression-webpack-plugin": "2.0.0", "css-loader": "2.1.1", "dtsgenerator": "2.0.6", "eslint": "5.14.1", @@ -103,8 +105,8 @@ "grunt-bump": "0.8.0", "grunt-cli": "1.3.2", "html-loader": "0.5.5", - "http-server": "0.11.1", "html-webpack-plugin": "3.2.0", + "http-server": "0.11.1", "husky": "2.1.0", "istanbul-instrumenter-loader": "3.0.1", "jasmine": "3.4.0", @@ -131,6 +133,7 @@ "ts-loader": "5.3.3", "typescript": "3.3.4000", "webpack": "4.29.6", + "webpack-bundle-analyzer": "3.3.2", "webpack-cli": "3.3.0", "webpack-dev-server": "3.3.1", "webpack-fix-style-only-entries": "0.2.1", diff --git a/webpack.common.js b/webpack.common.js index 37f686700..728323f79 100644 --- a/webpack.common.js +++ b/webpack.common.js @@ -22,6 +22,7 @@ const FixStyleOnlyEntriesPlugin = require('webpack-fix-style-only-entries'); const MiniCssExtractPlugin = require('mini-css-extract-plugin'); const HtmlWebpackPlugin = require('html-webpack-plugin'); const loaders = require('./webpack.loader'); +const CompressionPlugin = require('compression-webpack-plugin'); module.exports = { // Deployment target @@ -100,6 +101,11 @@ module.exports = { new HtmlWebpackPlugin({ template: 'webapp/template.html', filename: 'index.html' + }), + + new CompressionPlugin({ + algorithm: 'gzip', + test: /\.min.js$|\.min.css$|runtime.js$/ }) ] }; diff --git a/webpack.dev.js b/webpack.dev.js index 4b819ff56..f80fb8011 100644 --- a/webpack.dev.js +++ b/webpack.dev.js @@ -45,6 +45,9 @@ module.exports = merge(commonConfig, { // Enable Hot Module Replacement feature hot: true, + // Enable gzip compression for everything served + compress: true, + // The filename that is considered the index file. index: path.join(__dirname, 'index.html'), @@ -69,17 +72,17 @@ module.exports = merge(commonConfig, { const licTextArray = modules.map((lic) => { if (lic.licenseText && lic.licenseId) { const license = lic.licenseText.replace(/\n/gm, '\n\t'); - const licText =`This product bundles '${lic.packageJson.name}' which is available under a(n) ${lic.licenseId} license.\n\n\t${license}`; + const licText = `This product bundles '${lic.packageJson.name}' which is available under a(n) ${lic.licenseId} license.\n\n\t${license}`; return licText; } else { console.log('\n**********************\n'); console.log(lic.packageJson); if (lic.packageJson.license) { - const missingLicenseText = `*** No license text found ***\n` - const licText =`This product bundles '${lic.packageJson.name}' which is available under a(n) ${lic.packageJson.license} license.\n\t${missingLicenseText}`; + const missingLicenseText = `*** No license text found ***\n`; + const licText = `This product bundles '${lic.packageJson.name}' which is available under a(n) ${lic.packageJson.license} license.\n\t${missingLicenseText}`; - return licText + return licText; } else { return `\n\n!!! No license information found for ${lic.packageJson.name} !!!\n\n`; } diff --git a/webpack.prod.js b/webpack.prod.js index 299dc08db..72a4acad6 100644 --- a/webpack.prod.js +++ b/webpack.prod.js @@ -18,6 +18,7 @@ const merge = require('webpack-merge'); const TerserJSPlugin = require('terser-webpack-plugin'); const OptimizeCSSAssetsPlugin = require('optimize-css-assets-webpack-plugin'); +const cssnano = require('cssnano'); const commonConfig = require('./webpack.common'); @@ -29,12 +30,21 @@ module.exports = merge(commonConfig, { devtool: 'source-map', optimization: { + noEmitOnErrors: true, minimizer: [ // Minify JavaScript new TerserJSPlugin({}), // Minify CSS - new OptimizeCSSAssetsPlugin({}) + new OptimizeCSSAssetsPlugin({ + cssProcessor: cssnano, + cssProcessorOptions: { + discardComments: { + removeAll: true + } + }, + canPrint: false + }) ], - }, + } });