Node.js 全局对象

process、console、global、setTimeout 家族、以及它们和浏览器 window 的差别。

Beginner
Key PointsNode 的顶层对象是 `global`,最常用的是 `process`——它承载参数、环境变量和生命周期事件。

process

JavaScript
console.log(process.version);        // v22.22.2
console.log(process.platform);       // win32 / linux / darwin
console.log(process.arch);           // x64 / arm64
console.log(process.pid);            // 进程号
console.log(process.cwd());          // 当前工作目录
console.log(process.argv);           // [ node, 脚本路径, ...参数 ]
console.log(process.env.NODE_ENV);   // 环境变量
console.log(process.memoryUsage());  // 内存占用
Output
v22.22.2
win32
x64
24188
C:\Users\Administrator\demo
[ 'C:\\Program Files\\nodejs\\node.exe', 'C:\\Users\\Administrator\\demo\\app.js' ]
development
{ rss: 40177664, heapTotal: 5832704, heapUsed: 3241704, external: 1206312 }

命令行参数

JavaScript
// node app.js --port 3000 --debug
const args = process.argv.slice(2);

function getFlag(name, fallback) {
  const i = args.indexOf('--' + name);
  return i === -1 ? fallback : args[i + 1] ?? true;
}

console.log(getFlag('port', 8080));   // 3000
console.log(getFlag('debug', false)); // true

Node 18.3+ ships util.parseArgs — use it in anything serious instead of hand-parsing:

JavaScript
const { parseArgs } = require('node:util');

const { values } = parseArgs({
  options: {
    port: { type: 'string', short: 'p', default: '8080' },
    debug: { type: 'boolean', short: 'd', default: false },
  },
});
console.log(values);
Output
$ node app.js -p 3000 -d
{ port: '3000', debug: true }

生命周期事件

JavaScript
// 优雅退出:收到信号后关服务器、断数据库
process.on('SIGINT', async () => {
  console.log('收到 Ctrl+C,正在退出');
  await server.close();
  await db.end();
  process.exit(0);
});

process.on('uncaughtException', (err) => {
  console.error('未捕获异常', err);
  process.exit(1);       // 状态不确定,必须退出
});

process.on('unhandledRejection', (reason) => {
  console.error('未处理的 rejection', reason);
  process.exit(1);
});
After uncaughtException, do not keep running. The process may be mid-write and its state is no longer trustworthy; continuing can corrupt data. Log, exit, and let the process manager restart.

其他全局

GlobalNote
global顶层对象,相当于浏览器的 window
consolelog / error / table / time / dir
setTimeout返回 Timeout 对象,可 unref()
queueMicrotask插一个微任务
fetchNode 18+ 内置
structuredClone深拷贝,Node 17+
JavaScript
// unref:让定时器不阻止进程退出
const t = setTimeout(() => console.log('不会执行'), 60000);
t.unref();

// 深拷贝
const a = { d: new Date(), arr: [1, 2] };
const b = structuredClone(a);
console.log(b.d instanceof Date, b.arr !== a.arr);
Output
true true

Friends & Partners