11-区分环境配置

126 阅读2分钟

区分环境配置

之前有再webpack-config.js中写mode这个参数,但是发现其实这个mode可以被改变,比如:

npx webpack --mode development | production

这个优先级最高,其次是webpack.config.js,最后才是默认的production

cross-env

在过去的时候,webpack需要区分当前不同的环境的话只能根据 process.env.NODE_ENV,这样的话就需要在每次执行指令的时候指定对应的环境变量。

但是难受的是,不同平台配置node环境变量的方式不同:cross-env 就是为了解决这个问题。

不过这样依然很麻烦,webpack5能够支持函数导出,这有了转机

webpack.config.js

webpack.config.js导出的最终的对象决定如何进行打包,但其实有两种格式的配置:

  • module.export = WebpackConfig
  • module.export = function(env) => WebpackConfig

当导出一个函数时,在生成配置之前会把在终端执行的命令的参数 组合成 env,因此可以在 函数内判断不同的env来返回不同的WebpackConfig

webpack-merge

为了拆分webpack.config.js文件,拆分成webpack.config.pro.js、webpack.config.dev.js。

我们确实可以通过 env导出不同的配置文件的对象,但是我们发现两个文件有太多的重复项,能不能抽离一个webpack.config.common.js,并在具体的环境中合并配置

这个时候就需要 webpack-merge 出场,它能对配置文件进行 深度合并

// webpack.config.js
const { merge } = require('webpack-merge')
const CommonWebpackConfig = require('./webpack.config.common.js')
const DevWebpackConfig = require('./webpack.config.dev.js')
const ProWebpackConfig = require('./webpack.config.pro.js')

// @params[0] => --env参数配置 @params[1] => webpack配置
module.exports = ({mode}, argv) => {
  switch(mode) {
    case 'development':
      return merge(CommonWebpackConfig, DevWebpackConfig);
    case 'production':
      return merge(CommonWebpackConfig, ProWebpackConfig);
  }
}
npx webpack --env production // @params[0] = { ...default, production: true }
npx webpack --env mode=production // @params[0] = { ...default, mode: 'production' }

当然其实也有其它方法:

  • 也可以通过 process.env.NODE_ENV 判断是什么环境,当然你必须在执行终端命令的时候设置NODE_ENV:'NODE_ENV=production webpack';
  • 当然可以通过webpack的命令式配置:'webpack --mode=development',然后再 argv 能获取到 mode的参数

总结

代码案例在 code-example / 08-example