1. 场景
- 已知
webpack
中存在一份默认配置文件,默认为webpack.config.js
,其中可以通过plugins
载入DefinePligin
插件用于定义全局环境变量 - 现在需要按照环境分为两种相同字段的配置以便区分测试环境对接的接口和生产环境对接的接口,如下所示:
1 | module.exports = { |
2. 解决方案
从webpack
官方帮助文档得知,如果想要按照不同的环境,加载不同的全局变量,可将默认的webpack.config.js
拆分为webpack.dev.js
,webpack.prod.js
与webpack.common.js
文件,再配合webpack-merge
对差异化配置按照加载环境的不同进行配置合并,从而避免在原配置文件中进行大量冗余的三目运算符或者if-else,具体变更如下所示:
project
1 | webpack-demo |
webpack.common.js
1 | const path = require('path'); |
webpack.dev.js
1 | const merge = require('webpack-merge') |
webpack.prod.js
1 | const merge = require('webpack-merge') |
最后,再通过启动命令webpack --config weboack.prod.js
指定加载的默认配置文件,即可完成配置文件分离
3. 小贴士
当遇到
TypeError: merge is not a function
- 检查
webpack-merge
与webpack
的版本适配 - 可尝试使用ES6解构赋值将
const merge = require('webpack-merge')
更改为const { merge } = require('webpack-merge')
后重试
- 检查
为什么
DefinePlugin
插件里头的value
需要用JSON.stringify()
方法进行处理因为在全局变量中
JSON.stringify(‘hello-world’)
与'hello-world'
是不同的- 当使用
JSON.stringify('hello-world')
时
1
if (hello === 'hello-world')
- 当直接使用
hello-world
时
1
if (hello === hello-world)
- 当使用