Node.js 中的 process 对象

process 对象的作用、常用属性和方法

问题

Node.js 中的 process 对象是什么?有哪些常用的属性和方法?

解答

process 是什么

process 是 Node.js 的全局对象,提供当前进程的信息并对其进行控制。

当我们通过 node xxx.js 启动一个文件时,实际上就开启了一个服务进程。每个进程拥有独立的内存空间和数据栈,进程之间默认无法访问彼此的数据。由于 JavaScript 是单线程语言,启动后只有一条主线程执行。

常用属性

process.env

环境变量对象,常用于获取不同环境的配置信息:

// 区分开发和生产环境
if (process.env.NODE_ENV === 'production') {
  // 生产环境配置
}

process.argv

获取命令行参数,返回数组:

// 执行: node app.js arg1 arg2
// process.argv[0]: Node 路径
// process.argv[1]: 被执行的文件路径
// process.argv[2]: arg1
// process.argv[3]: arg2

const args = process.argv.slice(2);
console.log(args); // ['arg1', 'arg2']

process.cwd()

返回当前进程的工作目录:

console.log(process.cwd()); // /Users/username/project

当 npm 包需要操作使用方项目的文件时,可以用 process.cwd() 获取项目路径。

其他常用属性

process.pid        // 当前进程 ID
process.ppid       // 父进程 ID
process.platform   // 操作系统平台,如 'darwin'、'win32'
process.uptime()   // 进程运行时间(秒)
process.title      // 进程名称

常用方法

process.nextTick()

在下一次事件循环开始前执行回调:

function foo() {
  console.log('foo');
}

process.nextTick(foo);
console.log('bar');

// 输出:
// bar
// foo

process.nextTick()setTimeout(fn, 0) 的区别:

  • process.nextTick() 在当前事件循环的调用栈清空后立即执行
  • setTimeout(fn, 0) 在下一次事件循环的 timer 阶段执行,时机不确定

进程事件监听

// 捕获未处理的异常
process.on('uncaughtException', (err) => {
  console.error('未捕获的异常:', err);
});

// 进程退出监听
process.on('exit', (code) => {
  console.log('进程退出,退出码:', code);
});

标准流

process.stdout.write('标准输出\n');
process.stderr.write('错误输出\n');

// 标准输入
process.stdin.on('data', (data) => {
  console.log('输入:', data.toString());
});

关键点

  • process 是全局对象,提供当前进程的信息和控制能力
  • process.env 用于环境变量配置,process.argv 获取命令行参数
  • process.cwd() 返回工作目录,process.nextTick() 在下次事件循环前执行
  • 可通过 process.on() 监听进程事件,如异常捕获和退出监听
  • process.nextTick() 优先级高于 setTimeout(fn, 0)