Skip to content

1.mode

webpack4.0增加了mode选项。以此来标明webpack在执行时使用相应模式的内置优化。

mode有两个值:developmentproduction。如果不设置mode的话,webpack默认采用modeproduction

两种配置方法:

  • 在相应的配置文件中直接设置。

    js
    module.exports = {
      mode: 'development' // or 'production'
    }
  • 通过CLI参数传递。

    shell
    webpack --mode=development --config webpack.config.js

在设置modedevelopmentproduction后,Node环境下的变量process.env.NODE_ENV也会对应设置为developmentproduction

另外,在mode的两种模式下,webpack会启用内置的不同插件。

2.mode: development

默认启用NamedModulesPluginNamedChunksPlugin。这两插件是为了保证module idchunk id的稳定。

js
// webpack.dev.config.js
module.exports = {
+ mode: 'development'
- plugins: [
-   new webpack.NamedModulesPlugin(),
-   new webpack.NamedChunksPlugin()
-   new webpack.DefinePlugin({ "process.env.NODE_ENV": JSON.stringify("development") }),
- ]
}

3.mode: production

默认启用FlagDependencyUsagePluginFlagIncludedChunksPluginModuleConcatenationPluginNoEmitOnErrorsPluginOccurrenceOrderPluginSideEffectsFlagPlugin以及UglifyJsPlugin

js
// webpack.production.config.js
module.exports = {
+  mode: 'production',
-  plugins: [
-    new UglifyJsPlugin(/* ... */),
-    new webpack.DefinePlugin({ "process.env.NODE_ENV": JSON.stringify("production") }),
-    new webpack.optimize.ModuleConcatenationPlugin(),
-    new webpack.NoEmitOnErrorsPlugin()
-  ]
}

4.process.env.NODE_ENV

在上面两章,我们了解到在利用mode设置developmentproduction的同时,webpack使用DefinePlugin插件,声明了全局变量process.env.NODE_ENV。要注意的一点,这个全局变量针对的是entry及其依赖文件,而不是webpack配置文件。

譬如,在entry及其依赖文件当中,访问结果是:

js
// 不要奇怪,process.env与process.env.NODE_ENV在这里没有关系。process.env.NODE_ENV是由DefinePlugin生成的特定全局变量。

console.log(process.env) //{}
console.log(process.env.NODE_ENV) //'development' or 'production'

而在webpack配置文件中,结果如下:

js
// 这里的process.env与process.env.NODE_ENV是有关系的。

console.log(process.env) //{ PATH: '', PWD: '', ... }
console.log(process.env.NODE_ENV) //undefined

那么如果想在webpack配置文件中访问process.env下的自定义属性,应该怎么操作呢?答案是使用 CLI命令行

假设在webpack配置文件中,想要让process.env.ENV的值为UAT,那么可以在package.jsonscripts中这样设置:

json
{
  "scripts": {
    "build:UAT": "ENV=UAT webpack --config webpack.config.js"
  }
}

webpack的配置文件当中,就可以访问到process.env.ENV,值为UAT

5.cross-env

利用CLI命令行设置自定义参数时,在不同的操作系统下,会有兼容性问题。譬如上例当中在mac上正常使用,但在windows上就有可能出问题。为了解决这个弊端,我们一般可以使用cross-env插件。

shell
yarn add cross-env -D

package.json中的scripts标签正确表示如下:

json
{
  "scripts": {
    "build:UAT": "cross-env ENV=UAT webpack --config webpack.config.js"
  }
}

6.webpack-merge

在实际项目,一般不会把webpack的相关配置都写入到一个文件webpack.config.js中。

webpack的配置文件通常设置为webpack.common.jswebpack.dev.jswebpack.prod.js。分别对应公共配置开发配置生产配置。这样的文件结构较为清晰、易于维护。

使用这种结构,推荐一个插件webpack-merge。它用来合并公共配置和具体的环境配置,使用之前先安装yarn add webpack-merge -D。在开发环境下:

js
// webpack.dev.js
const { merge } = require('webpack-merge')
const commonConfig = require('./webpack.common.js')

module.exports = merge(commonConfig, {
  plugins: [],
  optimization: {}
})