前言
今天来讲一下Webpack
配置环境变量,那么环境变量是干啥的。我们在开发项目中都会遇到这种场景,区分开发环境、生产环境、测试环境,不同场景请求不同的接口Api
。这时候项目中配置的环境变量就登场啦~,下面来讲一下配置环境变量的方式吧。
配置方法
Set or Export
该方式有个棘手的问题就是windows
和mac
使用的方式还不同,不同系统使用启动项目还得更改代码,这就有点难受,我们来看一下。
package.json
windows
系统如下配置
{
"scripts": {
"dev": "set NODE_ENV=dev && node index.js"
}
}
mac
系统如下配置
{
"scripts": {
"dev": "export NODE_ENV=dev && node index.js"
}
}
效果
webpack.config.js
文件
console.log(process.env.NODE_ENV) // dev
该配置方式如果用windows
方式配置,用mac
电脑启动这样就会有问题,我们还得手动更改,这样非常的繁琐。
Cross-env
该插件就是解决上面我们所说的问题(不同系统使用不同的配置方式),该插件称为 "跨平台环境变量",就是一套代码兼容两端。下面我们来案例
安装
npm i cross-env -D
在项目下package.json
中配置
{
"scripts": {
"dev:serve": "set NODE_ENV=baidu.com && npx webpack-dev-server --config=./config/webpack.config.js",
}
}
webpack.config.js
console.log(process.env.NODE_ENV) // baidu.com
但是上面这样还有个问题是,虽然我们环境变量配置好了,但是只能在webpack.config.js
里面使用。我们来到main.js
文件下打印看看呢。
main.js
console.log(process.env.NODE_ENV) // undefined
上面main.js
可以清楚的看到,打印结果为undefined
,这是为什么呢,是因为当前的环境变量,只是在node
环境中生效,在浏览器中并没有,所以main.js
里面获取到的是undefined
。
有坑 - 误区
webpack.config.js
console.log(process.env.NODE_ENV) // baidu.com
module.exports = {
mode: "development"
}
main.js
console.log(process.env.NODE_ENV) // development
咦,这次怎么main.js
里面环境变量又变成development
了,这是因为浏览器环境中NODE_ENV
走的是webpack
里的mode
。
- webpack-dev-server 默认就是 --mode=development
- webpack 默认就是 --mode=production
注意这里的坑,避免出错。
回归主题,那么既然cross-env
环境变量只能在node
环境下使用,那怎么在浏览器环境下使用呢。配合Webpack
提供的内置插件全局变量,我们来配置一下。
webpack.config.js
console.log(process.env.NODE_ENV) // baidu.com
const webpack = require("webpack")
module.exports = {
mode: "development",
plugins: [
new webpack.DefinePlugin({
"process.env.NODE_ENV": JSON.stringify(process.env.NODE_ENV)
})
]
}
main.js
console.log(process.env.NODE_ENV) // baidu.com
这时再看,cross-env
全局变量已经覆盖掉mode
的啦,上面JSON.stringify
是防止解析成为一个变量。现在可以在全局项目中随意使用环境变量啦~。
我是蛙人,我们下篇见。
公众号:前端娱乐圈
感谢
谢谢你读完本篇文章,希望对你能有所帮助,如有问题欢迎各位指正。
我是蛙人(✿◡‿◡),如果觉得写得可以的话,请点个赞吧❤。
感兴趣的小伙伴可以加入 [ 前端娱乐圈交流群 ] 欢迎大家一起来交流讨论
写作不易,「点赞」+「在看」+「转发」 谢谢支持❤