shell中如何为Node设置环境变量
利用 shell
在构建 run npm
命令的时候传递不同参数解决频繁改动代码的问题。
举一个比较常见的场景,如果我们做移动端开发,有时候需要调试一些东西,例如我们会用 vconsole
,我们可能会写这一段代码
1 |
|
但是有另一种情况,我们部署到测试环境了,我们依然需要打开调试,但是部署之后如果我们不设置环境变量,我们的环境会被误认为线上环境,也就是 process.env.NODE_ENV
是 production
。
基于这个问题,我们可以在构建的时候去做一些处理,整体的思路就是:执行 shell
构建的时候我们为对应的构建命令传递参数,shell
拿到这个参数之后,就可以把参数加到环境变量中,node
便可以读取出来,从而在我们打包的时候,node
从 process.env
中读取这个值进行不同的逻辑处理。
如果我们的构建是通过 shell
来编写的话,那会更加容易和好理解。
假设我们的项目是 vue
,并且根目录下构建脚本是这样子的:
1 |
|
我们的 package.json
里面会有 dev
和 pro
的 build
命令。package.json
里的命令假设如下:
1 |
|
我们最终还需要有 web
来触发 sh
,并且可以承载手动构建的时候传递不同的参数。
从上边的命令来看,本地打包和生产打包其实没有什么区别,分别是开发环境下的 build
和生产环境下的 build
,那我们部署测试环境的时候一般都使用的是 npm run build
,而我们上线时候的打包命令也是这个。那我们怎么才能区分出来是什么环境呢?
假设我们的 shell
是这样写的
1 |
|
如果我们手动构建可以在 web
端通过 ci
把参数值分别传递不同的命令中,这样我们就可以在 web
手动构建的时候为不同的环境构建传递不同的参数值,当我们执行 sh script/dev.build.sh ${VCONSOLE_ENABLE}
,我们便会在 sh
里获取到对应的变量$1
,从而通过 shell
条件导出环境变量,1
开启,其他值关闭,并且默认应该关闭。
这个时候我们的 node process
是可以读取到这个变量的,通过 process.env.VCONSOLE_ENABLE === 'true'
便可以判断是否需要开启调试,从而在构建的时候执行要不要引入 vconsole
。
最终我们 main.js
的代码会变成:
1 |
|
从而在构建的时候解决需不需要开启调试的功能而非每次修改代码~~
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!