diff --git a/packages/gatsby-cli/src/create-cli.js b/packages/gatsby-cli/src/create-cli.js index b3645263d4b1a..0cdf6c0626b6c 100644 --- a/packages/gatsby-cli/src/create-cli.js +++ b/packages/gatsby-cli/src/create-cli.js @@ -124,6 +124,10 @@ function buildLocalCommands(cli, isLocalSite) { type: `boolean`, default: false, describe: `Build site with link paths prefixed (set prefix in your config).`, + }).option(`no-uglify`, { + type: `boolean`, + default: false, + describe: `Build site without uglifying JS bundles (for debugging).`, }), handler: handlerP( getCommandHandler(`build`, (args, cmd) => { diff --git a/packages/gatsby/src/commands/build.js b/packages/gatsby/src/commands/build.js index 8a4fb4c008b2b..05533d41a32b6 100644 --- a/packages/gatsby/src/commands/build.js +++ b/packages/gatsby/src/commands/build.js @@ -18,6 +18,7 @@ type BuildArgs = { sitePackageJson: object, browserslist: string[], prefixPaths: boolean, + noUglify: boolean, } module.exports = async function build(program: BuildArgs) { diff --git a/packages/gatsby/src/utils/babel-config.js b/packages/gatsby/src/utils/babel-config.js index 88f89dbd71fba..0c1b18e81edb7 100644 --- a/packages/gatsby/src/utils/babel-config.js +++ b/packages/gatsby/src/utils/babel-config.js @@ -128,7 +128,7 @@ function findBabelPackage(directory) { * the paths will be absolute so that Babel behaves as expected. */ module.exports = async function babelConfig(program, stage) { - const { directory } = program + const { directory, noUglify } = program let babelrc = findBabelrc(directory) || findBabelPackage(directory) @@ -149,7 +149,7 @@ module.exports = async function babelConfig(program, stage) { require.resolve(`babel-preset-env`), { loose: true, - uglify: true, + uglify: !noUglify, modules: `commonjs`, targets: { browsers: program.browserslist, diff --git a/packages/gatsby/src/utils/webpack.config.js b/packages/gatsby/src/utils/webpack.config.js index 349cbbf6ee035..fe161630f9a42 100644 --- a/packages/gatsby/src/utils/webpack.config.js +++ b/packages/gatsby/src/utils/webpack.config.js @@ -45,6 +45,7 @@ module.exports = async ( // webpack config. const stage = suppliedStage const babelConfig = await genBabelConfig(program, suppliedStage) + const { noUglify } = program function processEnv(stage, defaultNodeEnv) { debug(`Building env for "${stage}"`) @@ -235,7 +236,7 @@ module.exports = async ( .getState() .pages.map(page => page.componentChunkName) components = uniq(components) - return [ + const plugins = [ // Moment.js includes 100s of KBs of extra localization data by // default in Webpack that most sites don't want. This line disables // loading locale modules. This is a practical solution that requires @@ -315,26 +316,31 @@ module.exports = async ( filename: `chunk-manifest.json`, manifestVariable: `webpackManifest`, }), - // Minify Javascript. - new webpack.optimize.UglifyJsPlugin({ - compress: { - screw_ie8: true, // React doesn't support IE8 - warnings: false, - }, - mangle: { - screw_ie8: true, - }, - output: { - comments: false, - screw_ie8: true, - }, - }), // Ensure module order stays the same. Supposibly fixed in webpack 2.0. new webpack.optimize.OccurenceOrderPlugin(), new GatsbyModulePlugin(), // new WebpackStableModuleIdAndHash({ seed: 9, hashSize: 47 }), new HashedChunkIdsPlugin(), ] + if (!noUglify) { + // Minify JavaScript. + plugins.push( + new webpack.optimize.UglifyJsPlugin({ + compress: { + screw_ie8: true, // React doesn't support IE8 + warnings: false, + }, + mangle: { + screw_ie8: true, + }, + output: { + comments: false, + screw_ie8: true, + }, + }) + ) + } + return plugins } default: throw new Error(`The state requested ${stage} doesn't exist.`)