Node 环境变量设置
通常情况下,我们需要针对不同环境(开发环境、集成环境、生产环境等),进行相应策略的打包(比如是否替换接口地址,代码是否压缩等)。
拿 Nodejs 打包工具来说,由于 Nodejs 打包工具运行在 Nodejs 环境中,要识别不同环境,就得配置 Nodejs 环境变量,并且把它当成判断不同环境的依据。
Nodejs 提供了 process.env API,它返回一个包含用户环境信息的对象。当我们给 Nodejs 设置一个环境变量,并且把它挂载在 process.env 返回的对象上,便可以在代码中进行相应的环境判断。
于是,在 Webpack 配置文件中,经常会看到类似的代码:
// webpack.config.js
module.exports = {
mode: process.env.NODE_ENV === 'production' ? 'production' : 'development',
...
}
要说明的是,NODE_ENV 这个名称只是开发社区的一种共识,名称内容是可以修改的。如果需要,你也可以把它定义为 NODE_XXX。
那么问题来了,如何设置 Nodejs 这个环境变量呢?总结下来,可通过以下几种方式。
在 Webpack 配置文件直接赋值
你只需要在 Webpack 打包配置文件中,直接给 process.env.NODE_ENV 赋值即可。不过,每次在不同环境下打包时,都要手动反复修改它的值。
// webpack.config.js
process.env.NODE_ENV = 'production';
module.exports = {
mode: process.env.NODE_ENV === 'production' ? 'production' : 'development',
...
}
命令行(CLI)设置
Windows 系统
Windows 系统下,最常用的命令行面板就是 CMD(Command的简写) 和 Powershell。它们的操作分别如下:
CMD (Command 或 命令提示符)
# 查看所有环境变量
set
# 查看单个环境变量(以 NODE_ENV 为例)
set NODE_ENV
# 设置单个环境变量(以 NODE_ENV 为例)
set NODE_ENV=production
# 删除单个环境变量(以 NODE_ENV 为例)
set NODE_ENV=
上面的命令行以 NODE_ENV 变量为例,在 CMD 命令面板的操作中,如果 NODE_ENV 没有设置,则通过 set NODE_ENV
命令查看时,会提示 环境变量 NODE_ENV 没有定义。
当设置完 NODE_ENV(假设设置值为 production),再通过 set NODE_ENV
命令查看时,会返回 NODE_ENV=production。
Powershell
# 查看所有环境变量
ls env:
# 查看单个环境变量(以 NODE_ENV 为例)
$env:NODE_ENV
# 设置单个环境变量(以 NODE_ENV 为例)
$env:NODE_ENV="production"
# 删除单个环境变量(以 NODE_ENV 为例)
del env:NODE_ENV
上面的命令行以 NODE_ENV 变量为例,在 Powershell 命令面板的操作中,若 NODE_ENV 没有设置,则通过 set NODE_ENV
命令查看它时,没有任何提示。
当设置完 NODE_ENV(假设设置值为 production),再通过 set NODE_ENV
命令查看它时,会返回 production。
注意点: 上面的环境设置只是临时的,即只针对当前运行窗口的环境有效。当CLI运行窗口关闭以后,相关设置都会丢失。
另外,虽然通过 CMD 和 Powershell 都能修改环境变量,但它们之间设置的环境变量并不会相互影响,即你在 CMD 可以设置 NODE_ENV 为 production,同时也可以在 Powershell 中设置 NODE_ENV 为 development,这也印证了上面的描述,设置只针对当前运行窗口有效 。
如果你希望设置一直生效(即 本地设置),可通过 控制面板 -> 系统和安全 -> 系统 -> 高级系统设置 -> 高级 -> 环境变量 这样进行设置(Windows10、可能需要重启)。
Mac 系统
相当于 Windows 系统,Mac 系统上的操作就轻松了不少。因为它只集成一种命令行终端,它设置 Nodejs 环境变量的语法如下:
# 查看所有环境变量
env
# 查看单个环境变量(以 NODE_ENV 为例)
echo $NODE_ENV
# 设置单个环境变量(以 NODE_ENV 为例)
export NODE_ENV=production
# 删除单个环境变量(以 NODE_ENV 为例)
unset NODE_ENV
在配置完 Nodejs 环境变量后,你就可以继续运行项目中的打包命令了。
配置 package.json
在项目配置文件 package.json 中,根据不同的打包命令去设置相应的 Nodejs 环境变量,是一种非常主流的做法。其实本质上来说,只是将在命令行面板设置环境变量的命令语句放到了 package.json 文件中,把 设置环境变量 和 打包 两个命令合并运行而已。这种方式,就是将 NODE_ENV 注入到 process.env 对象。不同环境下,设置如下:
Windows 系统
在这种方式下,无论你是使用 CMD (命令提示符) 还是 Powershell 命令行工具,你都可以在 package.json 这样配置:
{
...
"scripts": {
"build": "set NODE_ENV=production&& npm run clean && webpack",
"clean": "rimraf ./build && mkdirp build",
}
}
配置完后(mkdirp 是一个生成文件夹的第三方包),你只需要在命令行面板运行 npm run build 即可完成打包。
注意点: 在 Windows 系统中,你必须移除环境变量命令与 && 符号之间的空白。否者,配置的命令不能生效!
Mac 系统
{
...
"scripts": {
"build": "export NODE_ENV=production && npm run clean && webpack",
"clean": "rimraf ./build && mkdirp build",
}
}
从上面描述可以看到,不论是不同的操作系统,还是不同的命令行终端,虽然目的都是设置 Nodejs 环境变量,但它们的语法都不尽相同。这就带来两个问题:
- 在 Windows 开发部署的项目,可能在 Mac 系统无法正常打包
- 在跨平台开发的项目上,你还得记住每个命令行终端所使用的语法,也麻烦
为了解决这一问题,有人开发了 cross-env。
跨平台 - cross-env
cross-env 是一个跨平台设置环境变量的第三方包,它可以让你只配置一行命令,就能轻松地在多个平台设置环境变量。
首先,你只需要安装它(由于多个项目在用,所以就全局安装了):
npm install -g cross-env
然后,在 package.json 文件中进行设置:
{
...
"scripts": {
"build": "npm run clean && cross-env NODE_ENV=production webpack",
"clean": "rimraf ./build && mkdirp build",
}
}
这样,不管你的电脑是 Windows 系统还是 Mac 系统 ,不管你用的 Powershell 还是 Git,你都可以正常设置 Nodejs 环境变量了。
注意点: cross-env NODE_ENV=production && npm run clean && webpack 此类的设置不能使环境变量生效。原因是 && 符号把命令语句分离成了多个,每一个命令执行的环境都是隔离的,而 cross-env 无法作用于其他环境的命令。
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!