首先 process.env 是什么?

node环境变量:

  • process 是node的全局变量,类似浏览器的window;
  • env 是process的一个属性。

官方解释:process 对象是一个全局变量,提供了有关当前 Node.js 进程的信息并对其进行控制;而 process.env 属性会返回包含用户环境的对象,如下所示(官方示例):

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

它是 Nodejs 应用程序中,process.env 属性,返回包含用户环境的对象,所以它不可以在客户端侧代码中使用,简单得来说就是浏览器上,打包后的静态资源。

这时候就有人说了(假如):不对啊,人家在写 Vue 项目的时候,可以在使用啊;比如 VUE_APP_TITLE,可以这样访问:

console.log(process.env.VUE_APP_TITLE)

懂的同学马上就懂了,不懂的同学你来看:VUE_APP_TITLE,标重点了,VUE_APP。

是不是有那么一丝明悟,对的,在写 Vue 项目时,在客户端侧代码中,只有以 VUE_APP_ 开头的变量会被 webpack.DefinePlugin 静态嵌入到客户端侧的包中,你才可以在应用的代码中访问它们;当然,还有两个特殊的变量也可以在应用中访问:NODE_ENV 和 BASE_URL;来自官方的解释:传送门(opens new window)

同样在 React 应用中,除了一些内置变量( NODE_ENV 和 PUBLIC_URL )之外,变量名必须以 REACT_APP_ 开头才能使用。

#如何修改?

要好好的使用 process.env,当然要知道如何修改它,怎么修改呢?

答:直接赋值。

process.env.girlfriend = 100
console.log(process.env.girlfriend)

打印出来的是字符串?聪明的同学已经发现了。

嗯,我们确实不推荐这样的行为,因为在 process.env 上为属性赋值会隐式地将值转换为字符串:

process.env.girlfriend = true;
console.log(process.env.girlfriend);
// => 'true' process.env.girlfriend = 1;
console.log(process.env.girlfriend);
// => '1' process.env.girlfriend = null;
console.log(process.env.girlfriend);
// => 'null' process.env.girlfriend = undefined;
console.log(process.env.girlfriend);
// => 'undefined' process.env.girlfriend = {a: 'aa'};
console.log(process.env.girlfriend);
// => '[object Object]'

并且,当值不是字符串、数字或布尔值时,Node.js 未来的版本可能会抛出错误。

增删改查,如何删呢?直接 delete 就行了:

process.env.girlfriend = 1;
delete process.env.girlfriend
console.log(process.env.girlfriend);
// => undefined

注意,在 Windows 操作系统上,环境变量没有大小写之分:

process.env.GIRLFRIEND = 1;
console.log(process.env.girlfriend);
// => 'q'

如何方便的切换环境?

在公司中,一个项目一般会有开发版本、测试版本、线上版本,也许还有预上线版本,每个版本对应不同参数,比如请求的 API 地址,或者图像字体资源地址等等;

为了方便管理,我们通常做成配置文件的形式,根据不同的环境,加载不同的文件。毕竟我还要找女朋友,不能太 low 了。

#修改 package.json 文件

比如我们现在要设置的环境变量 girlfriend

{
...,
"scripts": {
"normal": "export girlfriend='woman' && node friend.js",
"sages": "export girlfriend='monster' && node friend.js" // 在windows上export要换成set
},
...

npm run normal 就是正常模式

npm run sages 就是贤者模式

现在,我们可以通过配置 package.json 来设置环境变量,就可以在代码中获取对应的值,所以我们就可以很轻松的换环境了。

别急,可以使用 cross-env (opens new window)依赖包,支持跨平台配置环境变量。 安装依赖:

npm install --save-dev cross-env

配置环境

"scripts": {
"normal": "cross-env girlfriend='woman' node friend.js"
}

这样是不是好很多了~

不对啊,贤者模式有很多种情况啊,比如时长、地点等等,一大串的拼在后面也很 low。

其实有多种方法来解决这个问题,比如写个 env 模块

// env.js
module.exports = {
'normal': {
// 正常模式下的
},
// 其他模式
}

然后不同命令加载不同对象,进而修改环境变量:

const envConfig = require('env.js')[process.env.NODE_ENV];
if (Object.prototype.toString.call(envConfig) === '[object Object]') {
for (const k in envConfig) {
process.env[k] = envConfig[k]
}
}

当然还有很多种方式。

在这里,我推荐使用 .env文件 结合 dotenv 依赖包的方式来实现。

#关于 dotenv

dotenv 是一个零依赖包,可将环境变量从 .env 文件加载到 process.env;其原理是将 .env 文件解析为 json 对象,并对其中的 key-value 对通过 process.env 将其赋值为环境变量,之后便可通过 process.env[key] 来使用。

基本使用流程如下

#安装

# with npm
npm install dotenv # or with Yarn
yarn add dotenv

#使用

require('dotenv').config() // 默认是.env文件
它会把项目根目录下的 .env 文件内容加载到 process.env。

我们也可以使用它的 Parse 方法,拿到一个 json 对象
const fs = require('fs')
const dotenv = require('dotenv')
const config = dotenv.parse(fs.readFileSync('.env')) // will return an object
console.log(typeof config, config) // object { girlfriend : 'woman' }

更多相关内容,请见:传送门(opens new window)

#分享一下我的方案

首先,不同环境对应不同 .env 文件,如:.env.beta.env.prod

.env 文件

NODE_ENV = 'development'
HOST = 'lacalhost'
PORT = 3000
MONGODB_HOST = '127.0.0.1'
MONGODB_USERNAME = 'root'
MONGODB_PASSWORD = '123'

.env.prod 文件

NODE_ENV = 'production'
HOST = '10.100.xx.xx'
PORT = 3000
MONGODB_HOST = '43.247.xx.xx'
MONGODB_USERNAME = 'root'
MONGODB_PASSWORD = 'xxxxxx'

之后在 scripts 命令中,使用 --mode 参数来区分不同环境,并与相关文件名对应;

package.json 文件

{
...,
"scripts": {
"dev": "cross-env nodemon server/index.js --watch",
"prod": "cross-env node server/index.js --mode prod"
},
...
}

然后在执行文件中,拿到命令参数 process.argv,并根据不同 mode 来加载不同 .env 文件,这样,我们就可以很轻松的换环境了;

server/index.js 文件

const dotenv = require('dotenv')
const argv = process.argv
const mode = argv[2] === '--mode' ? argv[3] : ''
const envFile = mode ? `.env.${mode}` : '.env'
dotenv.config({ path: envFile })

问题,声明命令参数必须统一,这样通过 process.argv 拿到的参数才能正确。比如:

// package.json
"scripts": {
"dev": "cross-env nodemon server/index.js --watch --mode dev"
} // server/index.js
console.log(process.argv)
// => ['xxx', 'xx', 'dev']

如果,要按照我这样的方式拿到参数,必须这样声明:

// package.json
"scripts": {
"dev": "cross-env nodemon server/index.js --mode dev --watch"
}

关于 process.argv 方面的内容,我不是特别明白,若有错误请见谅。

原文链接:来,让我们一起来盘盘 Nodejs 环境变量(process.env)

其它链接:话说process.env的那些事儿

[转]来,让我们一起来盘盘 Nodejs 环境变量(process.env)的更多相关文章

  1. Delphi 自动检测U盘插入、拔出及获取U盘盘符!

    http://qqhack8.blog.163.com/blog/static/1141479852012102133475/     Delphi 自动检测U盘插入.拔出及获取U盘盘符! u盘的 插 ...

  2. Windows如何自定义U盘盘符、文件夹图标、文件夹背景

    自定义U盘盘符.文件夹图标.文件夹背景 注意对于Vista和Win7的用户不支持文件夹图标和文件夹背景的更换 1.自定义盘符:在U盘根目录下新建文件 autorun.inf(可先建.txt文本文档,再 ...

  3. 重装系统快速恢复使用习惯(各种图标摆放位置、环境变量、C盘可能存放的文件备份、编辑器配置、语言环境导出)

    目录 电脑重装系统注意点 - 尽可能快速恢复你熟悉的 windows 基本使用场景 最好截图的点 常见文件拷贝 入口 查看桌面图标.快捷方式有哪些 程序员大合集 环境变量相关 pycharm 快捷键等 ...

  4. win10家庭版更改本地账户名、C盘Users下文件夹名和环境变量等

    PS:由于四五年前装系统的时候懵懵懂懂的敲了一个中文用户名(有一个字还打错了,尴尬),导致现在打开cmd默认是C:\Users\中文名,path环境变量中也有中文路径,有时候有些程序的路径也是中文,这 ...

  5. 根据随身固态U盘卷标搜索U盘盘符并打开文件的批处理脚本.bat 徐晓亮 595076941@qq.com 2019年12月19日6点50分

    @Echo offRem 根据随身固态U盘卷标搜索U盘盘符并打开文件的批处理脚本.batRem 徐晓亮 595076941@qq.com 2019年12月19日6点50分 Rem 此批处理脚本源代码的 ...

  6. 非常的奇葩,终于解决了硬盘从盘盘符消失的问题 http://bbs.gamersky.com/thread-1712710-1-1.html (出处: 游民星空论坛)

    本人用电脑也十多年了,硬盘的问题也碰到过不少.但最近却碰到了一个很奇葩的问题.就是安装了一块全新的SSD硬盘当从盘,但在装上之后,在我的电脑中却不显示,没有盘符.不过打开系统磁盘管理却能显示硬盘信息. ...

  7. 总结:在MyEclipse中部署一个wap应用时需要配置的环境变量,我的JDK是安装在C盘,mysql安装在D盘,Tomcat解压在E盘,所以路径一定要看清楚哦,!

  8. vue cli 3

    介绍 Vue CLI 是一个基于 Vue.js 进行快速开发的完整系统 通过 @vue/cli 搭建交互式的项目脚手架. 通过 @vue/cli + @vue/cli-service-global 快 ...

  9. Node.js 教程 01 - 简介、安装及配置

    系列目录: Node.js 教程 01 - 简介.安装及配置 Node.js 教程 02 - 经典的Hello World Node.js 教程 03 - 创建HTTP服务器 Node.js 教程 0 ...

  10. Linux设备模型(3)_Uevent

    转自:http://www.wowotech.net/linux_kenrel/uevent.html 1. Uevent的功能 Uevent是Kobject的一部分,用于在Kobject状态发生改变 ...

随机推荐

  1. OpenFunction 0.6.0 发布: FaaS 可观测性、HTTP 同步函数能力增强及更多特性

    OpenFunction 是一个开源的云原生 FaaS(Function as a Service,函数即服务)平台,旨在帮助开发者专注于业务逻辑的研发.在过去的几个月里,OpenFunction 社 ...

  2. 云原生爱好者周刊:使用 AWS 开源的 FireCracker 来创建和管理 K8s 集群

    开源项目推荐 KubeFire 这个项目比较有创意,它使用 AWS 开源的轻量级虚拟化项目 FireCracker 来创建和管理 Kubernetes 集群,摒弃了传统的 qcow2 和 vhd 等虚 ...

  3. 2021年华为Java面试真题解析,帮你解决95%以上的问题!

    前言 由于作者面试过程中高度紧张,本文中只列出了自己还记得的部分题目. 经历了漫长一个月的等待,终于在前几天通过面试官获悉已被蚂蚁金服录取,这期间的焦虑.痛苦自不必说,知道被录取的那一刻,一整年的阴霾 ...

  4. Invalid default value for prop "value": Props with type Object/Array must use a factory function to return the default value.

    Invalid default value for prop "value": Props with type Object/Array must use a factory fu ...

  5. Win11安装基于WSL2的Ubuntu

    1. 概述 趁着还没有完全忘记,详细记录一下在Win11下安装基于WSL2的Ubuntu的详细过程.不得不说WLS2现在被微软开发的比较强大了,还是很值得安装和使用的,笔者就通过WLS2安装的Ubun ...

  6. 4-1 C++运算符基本概念

    目录 4.1.1 基本概念 函数观点 左值和右值 运算符重载 4.1.2 优先级.结合律与求值顺序 优先级和结合律 求值顺序 书中表述 实践表明(猜想) 实践验证 可能的解释:编译器的优化行为 一些运 ...

  7. 算法笔记——马拉核弹(Mana Nuclear)

    0x00 摘要 "马拉核弹"算法由 SXHT 同学(2009~今)发明,并在 2024 年 11 月于某不知名学校机房内正式公布.该算法基于 1975 年发明的 Manacher ...

  8. (1) Pytorch深度学习—数值处理

    (1)Pytorch--数值处理 参考于李沐"动手学深度学习"系列以及网上各路大佬的博客资料,感谢大家的分享,如错改,如侵删. torch中的数值处理 数值处理是深度学习中极其重要 ...

  9. 干货分享:Air780E怎么连接华为云?

    ​ 众所周知,市面上有很多云平台,阿里云.腾讯云.中移OneNET.华为云.百度云.涂鸦云.TLink云等等......并且每家云平台都有自己的协议,工程师要移植不同的SDK代码或基于各家的手册文档对 ...

  10. Sublime装sftp远程编辑插件

    我平时很喜欢用Sublime来编辑一些脚本软件,本次需要远程编辑Linux上的脚本,需要安装一些插件来完成. Ctrl+Shift+P呼叫出命令行面板后输入 install选择 Install Pac ...