js全局变量和局部变量名称一样_管理你的 Node.js 环境变量

环境变量

An environment variable is a dynamic-named value that can affect the way running process will behave on a computer.

简单说,环境变量指的是进程运行环境的一些参数,这些参数有可能会被进程使用,也可能被进程修改。

环境变量的用途是将代码中与环境相关的配置分离出来,从而使得程序在各个不同的环境下运行的时候只用修改环境变量就行了

Node.js 环境变量

Node.js 环境变量可以通过 process.env 访问,比如你有个环境变量 NODE_ENV=development 那么可以通过 process.env.NODE_ENV 拿到值。

process 是存在于 Node.js 环境的一个全局变量,是用来存放进程相关的一些 常量/变量/方法,process.env 则是存放进程程相关的环境对象,且允许修改

{
  TERM: 'xterm-256color',
  SHELL: '/usr/local/bin/bash',
  USER: 'maciej',
  PATH: '~/.bin/:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin',
  PWD: '/Users/maciej',
  EDITOR: 'vim',
  SHLVL: '1',
  HOME: '/Users/maciej',
  LOGNAME: 'maciej',
  _: '/usr/local/bin/node'
}

目前有两种方式可以将变量写入 process.env

1. shell command

NAME='c' node -e "console.log(process.env.NAME);" // c

这里需要注意,参数写在 node 命令前面和后面是不一样的

a=1 node test.js b=2

// process.env { a: 1 }
// process.args[2] b=2
  • 写在 node 前面的参数会被当作环境变量传入,从 process.env 访问
  • 写在 node 后面的参数则会被当作参数传入,从 process.args 访问

https://stackoverflow.com/questions/4351521/how-do-i-pass-command-line-arguments-to-a-node-js-program

2. dotenv

dotenv 是根据环境变量应该独立于代码这个原则而实现的一个库,使用这个库我们可以通过将环境变量写入 .env 文件来让 Node 进程读取。

使用这个库后,我们可以把配置抽出来成一个文件,方便管理。假设我们有个开发和生产两套环境配置,要根据环境变量来做区分,如果不使用 dotenv 可能要这么写

// package.json
scripts: {
  "dev": "A=1 B=2 node build.js",
  "prod": "A=3 B=4 node build.js"
}

如果使用 dotenv, 我们要建两个文件 .env.devlopment .env.production ,然后根据 NODE_ENV 来分别读取不同的配置。

// package.json
scripts: {
  "dev": "NODE_ENV=development node build.js",
  "prod": "NODE_ENV=production node build.js"
}

// .env.development
A=1
B=1

// .env.production
A=2
B=3


// build.js
require('dotenv').config({ path: `path/to/.env.${process.NODE_ENV}` })

webpack.DefinePlugin

有一点很奇怪,我们的代码最终是运行在浏览器的,而浏览器并不存在 process.env 这个变量,但是我们是可以在代码访问 process.env 比如

if (process.env.NODE_ENV === 'development') {
  // 开发环境逻辑
} else { 
  // 生产环境逻辑
}

为什么呢?

是因为我们使用了 webpack 插件 webpack.DefinePlugin

DefinePlugin 允许创建一个在 编译时可以配置的全局常量,这可能会对开发模式和生产模式的构建允许不同的行为非常有用。

这个插件主要的用途是全局替换,在打包的时候匹配文本进行热替换,比如

// 将运行时代码中的所有 NEED_TO_BE_REPLACED 替换成 123

// webpack.config.js
new webpack.DefinePlugin({
  NEED_TO_BE_REPLACED: JSON.stringify('123'),
})

// 打包前 index.js
console.log(NEED_TO_BE_REPLACED)

// 打包后 index.js
console.log("123")

create-react-app 的配置中,如果 eject ( npm run eject ) 出来,会有这么一段配置,将 process.env 的所有属性替换成其属性的值

// env.js
// Stringify all values so we can feed into Webpack DefinePlugin
const stringified = {
  'process.env': Object.keys(raw).reduce((env, key) => {
    env[key] = JSON.stringify(raw[key]);
    return env;
  }, {}),
};

// webpack.config.js
new webpack.DefinePlugin(env.stringified),

最后,小小提一下,传入给 Node.js 的环境变量仅限于 node 进程,并不会污染 Linux 环境变量。只有在 node 进程内部使用,无法从外部读取,进程结束后同样也无法读取。https://stackoverflow.com/questions/4870328/read-environment-variables-in-node-js

Note that this will not be visible outside the node process and its subprocesses. E.g. it wouldn't be visible if you fire env in another shell window while the node process is running, nor in the same shell after the node process exits.

(参考:Linux 环境变量)

假设我们的 Node.js 进程是运行在 Linux 环境中

运行 shell 时,会同时存在三种变量:

1.局部变量:局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量

NAME='a'
echo $NAME //a

2. 环境变量:所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。

export NAME='b'
printenv NAME # b

3. shell 变量:shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行

echo $PATH

Linux 是一个多用户系统,每个用户登陆后都会有一个专门的运行环境,如果用户想定制自己的运行环境,方法就是修改环境变量。

REF:

  • http://www.blockchainbrother.com/article/133
  • https://www.jianshu.com/p/0e810c615f8e
  • https://www.runoob.com/linux/linux-shell-variable.html
  • https://webpack.docschina.org/plugins/define-plugin/
  • https://medium.com/@trekinbami/using-environment-variables-in-react-6b0a99d83cf5
  • https://medium.com/the-node-js-collection/making-your-node-js-work-everywhere-with-environment-variables-2da8cdf6e786什么是环境变量
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值