首先 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. 2024-10-13:用go语言,给定一个二进制数组 nums,长度为 n, 目标是让 Alice 通过最少的行动次数从 nums 中拾取 k 个1。 Alice可以选择任何索引 aliceIndex

    2024-10-13:用go语言,给定一个二进制数组 nums,长度为 n, 目标是让 Alice 通过最少的行动次数从 nums 中拾取 k 个1. Alice可以选择任何索引 aliceIndex ...

  2. SpringBoot 2.3 升级到 SpringBoot 2.7 爬坑-- SpringDoc & Swagger

    目录 POM yml 配置自定义的 OpenAPI 规范 拦截器去除 swagger 的接口验证 模型 Controller 配置 常用注解 注意:Swagger支持SpringBoot2.0但不支持 ...

  3. 字符串、列表、元组、字典(python)

    文章目录 1.python字符串 1.1 python访问字符串中的值 1.2Python 字符串连接 1.3Python字符串运算符 2.python列表 2.1访问列表中的值 2.2更新列表 2. ...

  4. AI 居然说我是牛马,还画出了我牛马的一生,我绷不住了...

    今天真是服了,AI 居然敢嘲笑我是牛马,还直接甩了张大图到我脸上. 看来我的人生在 AI 眼中就是个笑话,从 "初级牛马" 一路升级到 "资深牛马".真是谢谢你 ...

  5. 在Windows环境下使用AMD显卡运行Stable Diffusion

    现在用的电脑是 21 年配的,当时并没有 AI 相关的需求,各种各样的原因吧,抉择后选择了 AMD 的显卡,但在 2024 年的今天,使用 AI 进行一些工作已不再是什么罕见的需求,所以我也想尝试一下 ...

  6. 【JVM第3课】运行时数据区

    运行时数据区结构图如下: 可分为 5 个区域,分别是方法区.堆区.虚拟机栈.本地方法栈.程序计数器.这里大概介绍一下各个模块的作用,会在后面的文章展开讲. 类加载子系统会把类信息加载到方法区,程序运行 ...

  7. 每日学学Java开发规范,集合处理(附阿里巴巴Java开发手册(终极版))

    前言 每次去不同的公司,码不同的代码,适应不同的规范,经常被老大教育规范问题,我都有点走火入魔的感觉,还是要去看看阿里巴巴Java开发规范,从中熟悉一下,纠正自己,码出高效,码出质量. 想细看的可以去 ...

  8. Oracle-表分析和索引分析解读

    概述当表没有做分析的时候,Oracle 会使用动态采样来收集统计信息. 获取准确的段对象(表,表分区,索引等)的分析数据,是CBO存在的基石,CBO的机制就是收集尽可能多的对象信息和系统信息,通过对这 ...

  9. HNCTF [Week1]Interesting_http

    <center>HNCTF [Week1]Interesting_http </center> 五毛钱翻译:请用post给我一个 want Burp Suite 抓包传参 &l ...

  10. 第二篇:低功耗模组Air724UG硬件设计手册

    ​  接着上篇,继续分享. 3.5 串口 模块提供了五个通用异步收发器:主串口 UART1.校准串口 UART2.通用串口 UART3.调试串口 HOST UART 和 ZSP UART. 3.5.1 ...