Node.js 全局对象
process、console、global、setTimeout 家族、以及它们和浏览器 window 的差别。
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)); // trueNode 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.其他全局
| Global | Note |
|---|---|
global | 顶层对象,相当于浏览器的 window |
console | log / error / table / time / dir |
setTimeout | 返回 Timeout 对象,可 unref() |
queueMicrotask | 插一个微任务 |
fetch | Node 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 trueprocess
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)); // trueNode 18.3+ 内置了 util.parseArgs,正式一点的项目直接用它,别手写解析:
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);
});uncaughtException 之后不要继续运行。异常发生时可能正处在半途的写操作中,进程状态已不可信,继续服务会写坏数据。记录日志后退出,让进程管理器重启。其他全局
| 全局 | 说明 |
|---|---|
global | 顶层对象,相当于浏览器的 window |
console | log / error / table / time / dir |
setTimeout | 返回 Timeout 对象,可 unref() |
queueMicrotask | 插一个微任务 |
fetch | Node 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