process 全局对象与环境变量
🎯 引言
学完这篇文章,你能用 process 对象读取命令行参数和环境变量,写出根据不同环境切换配置的程序,还会正确退出进程并理解退出码的含义。
🧱 process 是什么
process 是 Node.js 的全局对象,代表当前正在运行的这个 Node 进程。它不用 require 或 import,在任何文件里都能直接用。
可以把它理解成程序的“仪表盘和控制台”:程序运行在哪、用户传了什么参数、当前是什么环境、要不要退出,都通过它来查看和操作。
🛠 process.argv 读取命令行参数
执行 node greet.js 小明 18 时,process.argv 能拿到命令行里传入的参数,它是一个数组:
- 第 0 项:
node可执行文件的路径。 - 第 1 项:当前脚本文件的路径。
- 从索引 2 开始,才是我们自己传的参数。
写一个打招呼的小工具:
const name = process.argv[2];
console.log(`你好,${name}!欢迎学习 Node.js`);
node greet.js 小明
# 输出:你好,小明!欢迎学习 Node.js
18 拿到的也是 '18',要做数学计算记得先用 Number() 转换。🛠 process.env 环境变量
环境变量是从程序外部注入的配置,比如数据库地址、密钥、当前环境。它们不写在代码里,程序启动时通过 process.env 读取,这样既灵活又安全。
读取方式很简单,就像一个普通对象:
console.log(process.env.NODE_ENV); // 未设置时是 undefined
在命令行临时设置一个环境变量再运行:
# macOS / Linux
NODE_ENV=production node env.js
# Windows PowerShell 写法不同
$env:NODE_ENV="production"; node env.js
环境变量只在这一次进程运行期间生效,关掉终端窗口就没了。
💡 用环境变量区分环境
实际项目里,开发环境和生产环境的配置往往不同。用 NODE_ENV 切换配置是社区里非常普遍的做法:
const isProd = process.env.NODE_ENV === 'production';
const config = {
// 占位配置,实际项目换成真实的地址
apiUrl: isProd ? 'https://api.example.com' : 'http://localhost:3000',
debug: !isProd,
};
console.log('当前配置:', config);
node config.js # 开发配置
NODE_ENV=production node config.js # 生产配置
cross-env 包统一写法(本文环境:Node.js v22,cross-env@7)。装上后在 package.json 的脚本里写 cross-env NODE_ENV=production node app.js 即可,各个系统都能跑。🛠 其他常用成员
// 当前工作目录:你在哪个目录执行的 node 命令(path 一篇详细讲过)
console.log(process.cwd());
// 当前 Node.js 版本
console.log(process.version); // v22.x.x
// 退出进程:0 表示正常结束,非 0 表示异常退出
if (!process.env.NODE_ENV) {
console.log('缺少 NODE_ENV 环境变量');
process.exit(1);
}
退出码常用来告诉外部脚本“这次运行成功还是失败”,CI 流水线就是靠它判断任务成败的。
🧾 小节总结
process是全局对象,代表当前 Node 进程,无需引入即可使用。process.argv读取命令行参数,用户参数从索引 2 开始,且全部是字符串。process.env读取环境变量,只在当前进程生效,常用于注入外部配置。- 用
NODE_ENV区分开发和生产环境是社区的普遍做法,跨平台可用 cross-env。 process.exit(0)正常退出,非 0 表示异常,退出码可供外部脚本判断结果。
❓ 知识问答
Q1:process 需要 import 引入吗?
不需要,它是全局对象,任何文件里直接使用即可。
Q2:环境变量会保存到文件里吗?
不会。命令行里设置的环境变量只在这次进程运行期间存在于内存中,进程结束就消失了。想持久管理可以配合 .env 文件,那是工具包提供的方案,后续框架课程会接触。
Q3:为什么 argv 读到的数字参数计算结果不对?
因为参数都是字符串,'18' + 1 得到的是 '181'。计算前先 Number(process.argv[2]) 转换。
Q4:process.exit 后面的代码还会执行吗?
不会。process.exit 会立即终止进程,后面的代码没有机会运行,异步队列里的任务也会被丢弃,所以退出前要把该做的事情做完。
🧪 小练习
写一个加法计算器:执行 node add.js 3 5 输出 结果:8。要求:参数不足两个时提示“请传入两个数字”并以退出码 1 结束程序。
// 请在这里编写代码
🎉 恭喜你已经掌握 process 对象的核心用法!下一篇是这门课程的收官篇:events 事件模块,理解 Node.js 事件驱动的编程思想。
