Search code examples
node.jsnpmwebpackwebpack-4

Get current `--mode` in webpack.config.js


How can I get the current --mode specified in package.json inside webpack.config.js? (For instance, for pushing some plugins.)

package.json

"scripts": {
  "dev": "webpack --mode development",
  "build": "webpack --mode production"
}

What I did in Webpack 3:

package.json

"scripts": {
    "build": "cross-env NODE_ENV=development webpack",
    "prod": "cross-env NODE_ENV=production webpack"
  },

Then, I was able to get environment in Webpack with process.env.NODE_ENV.

Of course, I can pass NODE_ENV with --mode but I prefer to avoid duplication.


Solution

  • You want to avoid duplication of options passed on the script.

    When you export a function, the function will be invoked with 2 arguments: an environment env as the first parameter and an options map argv as the second parameter.

    package.json

    "scripts": {
      "build-dev": "webpack --mode development",
      "build-prod": "webpack --mode production"
    },
    

    webpack.config.js

    module.exports = (env, argv) => {
        console.log(`This is the Webpack 4 'mode': ${argv.mode}`);
        return {
            ...
        };
    }
    

    These are the results:

    For npm run build-dev:

    > webpack --mode development
    
    This is the Webpack 4 'mode': development
    Hash: 554dd20dff08600ad09b
    Version: webpack 4.1.1
    Time: 42ms
    Built at: 2018-3-14 11:27:35
    

    For npm run build-prod:

    > webpack --mode production
    
    This is the Webpack 4 'mode': production
    Hash: 8cc6c4e6b736eaa4183e
    Version: webpack 4.1.1
    Time: 42ms
    Built at: 2018-3-14 11:28:32