-
Notifications
You must be signed in to change notification settings - Fork 14
(五)配置环境变量
- 环境变量按作用来分分两种
- 区分是开发模式还是打包构建模式
- 区分项目业务环境,开发/测试/预测/正式环境
区分开发模式还是打包构建模式可以用
process.env.NODE_ENV
, 因为很多第三方包里面判断都是采用的这个环境变量。
区分项目接口环境可以自定义一个环境变量
process.env.BASE_ENV
, 设置环境变量可以借助cross-env
和webpack.DefinePlugin
来设置。
cross-env:兼容各系统的设置环境变量的包webpack.DefinePlugin:webpack内置的插件,可以为业务代码注入环境变量
- 安装cross-env
npm i cross-env -D
修改
package.json
的scripts
脚本字段,删除原先的start
和build
,改为
"scripts": {
"start:dev": "cross-env NODE_ENV=development BASE_ENV=development webpack-dev-server -c build/webpack.dev.js",
"start:test": "cross-env NODE_ENV=development BASE_ENV=test webpack-dev-server -c build/webpack.dev.js",
"start:pre": "cross-env NODE_ENV=development BASE_ENV=pre webpack-dev-server -c build/webpack.dev.js",
"start:prod": "cross-env NODE_ENV=development BASE_ENV=production webpack-dev-server -c build/webpack.dev.js",
"build:dev": "cross-env NODE_ENV=production BASE_ENV=development webpack -c build/webpack.prod.js",
"build:test": "cross-env NODE_ENV=production BASE_ENV=test webpack -c build/webpack.prod.js",
"build:pre": "cross-env NODE_ENV=production BASE_ENV=pre webpack -c build/webpack.prod.js",
"build:prod": "cross-env NODE_ENV=production BASE_ENV=production webpack -c build/webpack.prod.js",
},
start
开头是开发模式,build
开头是打包模式,冒号后面对应的dev/test/pre/prod
是对应的业务环境的开发/测试/预测/正式环境
。
process.env.NODE_ENV
环境变量webpack会自动根据设置的mode字段来给业务代码注入对应的development
和prodction
,这里在命令中再次设置环境变量NODE_ENV是为了在webpack和babel的配置文件中访问到。
- 在
webpack.base.js
中打印一下设置的环境变量
// webpack.base.js
// ...
console.log('NODE_ENV', process.env.NODE_ENV)
console.log('BASE_ENV', process.env.BASE_ENV)
执行
npm run build:dev
,可以看到打印的信息
// NODE_ENV production
// BASE_ENV development
当前是打包模式,业务环境是开发环境,这里需要把
process.env.BASE_ENV
注入到业务代码里面,就可以通过该环境变量设置对应环境的接口地址和其他数据,要借助webpack.DefinePlugin
插件。
- 修改webpack.base.js
// webpack.base.js
// ...
const webpack = require('webpack')
module.export = {
// ...
plugins: [
// ...
new webpack.DefinePlugin({
'process.env.BASE_ENV': JSON.stringify(process.env.BASE_ENV)
})
]
}
配置后会把值注入到业务代码里面去,
webpack
解析代码匹配到process.env.BASE_ENV
,就会设置到对应的值。 测试一下,在src/index.tsx
打印一下两个环境变量
// src/index.tsx
// ...
console.log('NODE_ENV', process.env.NODE_ENV)
console.log('BASE_ENV', process.env.BASE_ENV)
执行npm run start:test,可以在浏览器控制台看到打印的信息
// NODE_ENV development
// BASE_ENV test
当前是开发模式,业务环境是测试环境