全局对象
约 1678 字大约 6 分钟
2026-04-16
什么是 Node 全局对象
在 Node.js 环境中,有些对象不需要 require 导入就可以直接使用,比如 console、setTimeout、Buffer、process 等。这些对象被称为全局对象,是 Node 运行时在启动时提前注入到作用域中的能力入口。
Node 的全局对象机制与浏览器完全不同。浏览器中的 window 是 DOM/BOM 的顶层对象,而在 Node 中并没有 window。Node 的全局对象是 global,但它和浏览器的 window 完全是两码事——global 上面挂载的是 Node 特有的运行时能力,而非浏览器的前端 API。
提示
Node 中很多能力可以直接使用,但这不意味着应该滥用全局作用域。将变量随意挂载到 global 上会导致全局污染,在实际项目中应当避免这种做法。
常见全局对象分类
| 分类 | 对象 | 作用 | 是否推荐重点掌握 |
|---|---|---|---|
| 运行环境相关 | process | 进程信息、环境变量、命令行参数 | 必学 |
| 运行环境相关 | global | 全局对象本身 | 了解 |
| 定时器相关 | setTimeout | 延时执行 | 必学 |
| 定时器相关 | setInterval | 循环定时执行 | 必学 |
| 定时器相关 | setImmediate | 当前事件循环结束后执行 | 了解 |
| 模块系统相关 | require | 加载模块 | 必学 |
| 模块系统相关 | module | 模块对象 | 了解 |
| 模块系统相关 | exports | 模块导出 | 了解 |
| 二进制与编码 | Buffer | 处理二进制数据 | 必学 |
| 输出与调试 | console | 控制台输出 | 必学 |
| 路径相关 | __dirname | 当前文件所在目录 | 必学 |
| 路径相关 | __filename | 当前文件完整路径 | 必学 |
重点全局对象详解
global
global 是 Node.js 中的顶层对象,相当于浏览器中的 window。它上面挂载了所有全局可用的函数和对象。
console.log(global)global 与浏览器的 window 差异巨大:
- 浏览器
window包含 DOM、BOM 操作能力 global包含 Node 特有的能力,如文件系统、网络、进程等
global.myVar = 'hello'
function test() {
console.log(global.myVar) // hello
}
test()注意
向 global 挂载业务变量会导致全局污染,可能与第三方库产生冲突。在实际项目中,禁止将业务变量挂载到 global 上。
process
process 是 Node.js 中最重要的全局对象之一,它提供当前进程的相关信息和控制能力。
// 环境变量
console.log(process.env.NODE_ENV)
// 当前工作目录
console.log(process.cwd())
// 命令行参数
console.log(process.argv)
// 退出进程
process.exit(0)常见使用场景
- 环境变量读取:通过
process.env获取配置,如process.env.NODE_ENV - 命令行参数处理:
process.argv获取脚本执行时传入的参数 - 获取工作目录:
process.cwd()获取 Node 进程的当前工作目录 - 进程退出控制:
process.exit(code)主动退出进程,code 为 0 表示正常退出 - 信号处理:
process.on('SIGTERM', ...)优雅处理进程终止信号 - 平台信息:
process.platform、process.arch获取系统信息
Buffer
Buffer 用于处理二进制数据。在 Node.js 中,文件读取、网络数据传输等场景都会遇到二进制数据,字符串无法满足这些场景的需求。
// 从字符串创建 Buffer
const buf = Buffer.from('hello')
console.log(buf) // <Buffer 68 65 6c 6c 6f>
// 从数组创建 Buffer
const buf2 = Buffer.from([0x48, 0x65, 0x6c, 0x6c, 0x6f])
// 创建指定大小的 Buffer
const buf3 = Buffer.alloc(10)
// 转换为字符串
console.log(buf.toString('utf8')) // helloBuffer 是 Node.js 处理 I/O 操作的核心,无论是文件读写还是网络通信,底层都是基于 Buffer 进行数据交换。
__dirname 与 __filename
__dirname 表示当前文件所在的目录路径,__filename 表示当前文件的完整路径。
// 当前文件所在目录
console.log(__dirname) // /Users/zhaojisen/project/src
// 当前文件的完整路径
console.log(__filename) // /Users/zhaojisen/project/src/utils.js在路径拼接和资源读取时,这两个变量非常有用:
import { join } from 'node:path'
import { readFileSync } from 'node:fs'
const configPath = join(__dirname, '../config.json')
const config = JSON.parse(readFileSync(configPath, 'utf8'))注意
在 ES Module(import/export)中,__dirname 和 __filename 不能直接使用。需要通过 import.meta.url 配合 fileURLToPath 和 dirname 实现兼容:
import { dirname, join } from 'node:path'
import { fileURLToPath } from 'node:url'
const __filename = fileURLToPath(import.meta.url)
const __dirname = dirname(__filename)console
console 不仅用于普通日志输出,还提供错误输出和性能测量能力。
console.log('普通信息')
console.error('错误信息')
console.time('loop')
for (let i = 0; i < 1000; i++) {}
console.timeEnd('loop') // loop: 0.5msconsole.time 和 console.timeEnd 可以用于简单的性能测量,适合开发调试时快速定位耗时操作。
Node 与浏览器全局对象的区别
| 维度 | Node.js | 浏览器 |
|---|---|---|
| 全局对象名称 | global | window |
| DOM/BOM | 无 | 有 |
process | 有 | 无 |
Buffer | 有 | 无 |
| 模块系统 | CommonJS / ES Module | ES Module |
setTimeout/setInterval | 有 | 有 |
navigator | 无 | 有 |
Node.js 运行时与浏览器环境有本质区别。Node 没有 DOM 操作能力,不存在 document、navigator 等前端 API,但提供了浏览器不具备的进程控制、文件系统、网络通信等后端能力。
常见开发场景
环境变量管理
// 生产环境判断
if (process.env.NODE_ENV === 'production') {
console.log('生产环境')
}
// 数据库配置
const dbConfig = {
host: process.env.DB_HOST || 'localhost',
port: process.env.DB_PORT || 3306
}路径处理
import { join } from 'node:path'
import { readFileSync } from 'node:fs'
// 读取同目录下的配置文件
const configPath = join(__dirname, './config.json')
const config = JSON.parse(readFileSync(configPath, 'utf8'))处理二进制数据
import { createReadStream } from 'node:fs'
import { createGzip } from 'node:zlib'
// 压缩大文件
createReadStream('./file.txt')
.pipe(createGzip())
.pipe(createWriteStream('./file.txt.gz'))命令行参数处理
// node script.js --port 3000 --env production
const args = process.argv.slice(2)
// ['--port', '3000', '--env', 'production']
const config = {}
args.forEach((arg, i) => {
if (arg.startsWith('--')) {
config[arg.slice(2)] = args[i + 1]
}
})易错点与注意事项
注意
全局污染:
global并不是用来存放业务变量的地方,滥用会导致难以排查的冲突问题。环境变量类型:
process.env中的值始终是字符串,需要类型转换后再使用。ES Module 兼容:
__dirname和__filename在 ES Module 中不可直接使用,必须通过import.meta.url转换。定时器精度:
setTimeout和setInterval设置的回调并不保证精确执行,延迟取决于事件循环的状态。环境混淆:不要把 Node 的全局对象和浏览器环境混用理解,Node 没有
document、window、navigator等前端对象。
总结
Node.js 的全局对象是理解运行时能力边界的重要入口。process 提供进程控制能力,Buffer 处理二进制数据,__dirname/__filename 解决路径问题。这些对象不需要导入即可使用,但使用时应当注意全局作用域污染、环境变量类型转换、ES Module 兼容性等工程实践中的实际问题。理解全局对象的本质是掌握 Node.js 运行时特性的关键。
