diff --git a/dev_mode/package.json b/dev_mode/package.json index c3029da2d25e..de4b6f5d70c5 100644 --- a/dev_mode/package.json +++ b/dev_mode/package.json @@ -5,7 +5,8 @@ "scripts": { "build": "webpack", "build:prod": "cross-env NODE_OPTIONS=--max_old_space_size=4096 webpack --config webpack.prod.config.js", - "build:prod:stats": "cross-env NODE_OPTIONS=--max_old_space_size=4096 webpack --profile --config webpack.prod.config.js --json > stats.json", + "build:prod:minimize": "cross-env NODE_OPTIONS=--max_old_space_size=4096 webpack --config webpack.prod.minimize.config.js", + "build:prod:stats": "cross-env NODE_OPTIONS=--max_old_space_size=4096 webpack --profile --config webpack.prod.minimize.config.js --json > stats.json", "build:stats": "webpack --profile --json > stats.json", "clean": "rimraf build", "prepublishOnly": "npm run build", diff --git a/dev_mode/webpack.prod.minimize.config.js b/dev_mode/webpack.prod.minimize.config.js new file mode 100644 index 000000000000..a4aee1cc7575 --- /dev/null +++ b/dev_mode/webpack.prod.minimize.config.js @@ -0,0 +1,29 @@ +const TerserPlugin = require('terser-webpack-plugin'); +var merge = require('webpack-merge'); +var config = require('./webpack.config'); + +config[0] = merge(config[0], { + mode: 'production', + devtool: 'source-map', + optimization: { + minimizer: [ + new TerserPlugin({ + parallel: false, + sourceMap: true, + terserOptions: { + compress: false, + ecma: 6, + mangle: true, + output: { + beautify: false, + comments: false + }, + safari10: true + }, + cache: process.platform !== 'win32' + }) + ] + } +}); + +module.exports = config; diff --git a/jupyterlab/commands.py b/jupyterlab/commands.py index d2e2c89c638e..36a7388099a2 100644 --- a/jupyterlab/commands.py +++ b/jupyterlab/commands.py @@ -990,6 +990,7 @@ def _populate_staging(self, name=None, version=None, static_url=None, for fname in ['index.js', 'webpack.config.js', 'webpack.prod.config.js', + 'webpack.prod.minimize.config.js', '.yarnrc', 'yarn.js']: target = pjoin(staging, fname) shutil.copy(pjoin(HERE, 'staging', fname), target) diff --git a/jupyterlab/labapp.py b/jupyterlab/labapp.py index 4ef81e1ca8ae..9c7ce84c84c4 100644 --- a/jupyterlab/labapp.py +++ b/jupyterlab/labapp.py @@ -30,6 +30,7 @@ build_aliases['name'] = 'LabBuildApp.name' build_aliases['version'] = 'LabBuildApp.version' build_aliases['dev-build'] = 'LabBuildApp.dev_build' +build_aliases['minimize'] = 'LabBuildApp.minimize' build_aliases['debug-log-path'] = 'DebugLogFileMixin.debug_log_path' build_flags = dict(flags) @@ -64,11 +65,21 @@ class LabBuildApp(JupyterApp, DebugLogFileMixin): dev_build = Bool(False, config=True, help="Whether to build in dev mode (defaults to prod mode)") + minimize = Bool(True, config=True, + help="Whether to use a minifier during the Webpack build (defaults to True). Only affects production builds.") + pre_clean = Bool(False, config=True, help="Whether to clean before building (defaults to False)") def start(self): - command = 'build:prod' if not self.dev_build else 'build' + if self.dev_build: + command = 'build' + else: + if self.minimize: + command = 'build:prod:minimize' + else: + command = 'build:prod' + app_dir = self.app_dir or get_app_dir() self.log.info('JupyterLab %s', version) with self.debug_logging(): diff --git a/jupyterlab/staging/package.json b/jupyterlab/staging/package.json index 102b3afad167..f500ccab6b7c 100644 --- a/jupyterlab/staging/package.json +++ b/jupyterlab/staging/package.json @@ -5,7 +5,8 @@ "scripts": { "build": "webpack", "build:prod": "cross-env NODE_OPTIONS=--max_old_space_size=4096 webpack --config webpack.prod.config.js", - "build:prod:stats": "cross-env NODE_OPTIONS=--max_old_space_size=4096 webpack --profile --config webpack.prod.config.js --json > stats.json", + "build:prod:minimize": "cross-env NODE_OPTIONS=--max_old_space_size=4096 webpack --config webpack.prod.minimize.config.js", + "build:prod:stats": "cross-env NODE_OPTIONS=--max_old_space_size=4096 webpack --profile --config webpack.prod.minimize.config.js --json > stats.json", "build:stats": "webpack --profile --json > stats.json", "clean": "rimraf build", "prepublishOnly": "npm run build", diff --git a/jupyterlab/staging/webpack.prod.minimize.config.js b/jupyterlab/staging/webpack.prod.minimize.config.js new file mode 100644 index 000000000000..a4aee1cc7575 --- /dev/null +++ b/jupyterlab/staging/webpack.prod.minimize.config.js @@ -0,0 +1,29 @@ +const TerserPlugin = require('terser-webpack-plugin'); +var merge = require('webpack-merge'); +var config = require('./webpack.config'); + +config[0] = merge(config[0], { + mode: 'production', + devtool: 'source-map', + optimization: { + minimizer: [ + new TerserPlugin({ + parallel: false, + sourceMap: true, + terserOptions: { + compress: false, + ecma: 6, + mangle: true, + output: { + beautify: false, + comments: false + }, + safari10: true + }, + cache: process.platform !== 'win32' + }) + ] + } +}); + +module.exports = config;