理解 Node.js 中的全局对象、变量和 API 是开发的基础。它们提供了环境信息、核心功能以及与系统交互的能力。
1 全局对象:环境的核心
- 浏览器环境: 大家熟悉的
window
对象就是浏览器的全局对象。你在顶层定义的变量和函数,其实都挂在了window
上。 - Node.js 环境: 这里的老大是
global
对象。在 Node.js 里定义的顶层变量和方法,默认都会成为global
的属性。 - 环境通吃:
globalThis
(ES2020+): 它解决了不同环境全局对象名字不同的问题。无论在浏览器(返回window
)还是在 Node.js(返回global
)里,globalThis
都能指向正确的全局对象,让你的代码更通用。
2 全局变量:关键的环境信息
Node.js 提供了一些特殊的全局变量,帮你获取当前模块的信息,但它们在 CommonJS 和 ESM 模块系统中的表现方式不同:
- CommonJS 模块:
__dirname
:当前这个脚本文件所在的文件夹的绝对路径。__filename
:当前这个脚本文件本身的绝对路径(加上了文件名)。
- ESM 模块 :
import.meta
:专门存放当前模块的元信息。
3 内置全局 API:开箱即用的工具包
Node.js 在 global
对象上挂载了很多实用的内置 API。这些 API 你在代码里可以直接用,不需要 require
或 import
,非常方便!常见的有:
setTimeout
/setInterval
/clearTimeout
/clearInterval
:定时器,管理异步操作。Promise
:处理异步操作的标准方式。console
:打印日志、调试信息(log
,error
,warn
等)。Date
:处理日期和时间。Math
:提供数学计算函数和常量。fetch
(Node.js v18+ 开始稳定):发起网络请求(以前需要第三方库如node-fetch
)。URL
/URLSearchParams
:处理和解析 URLs。
3.1 Process:深入了解你的 Node.js 进程
概念
process
是 Node.js 环境独有且极其重要的全局对象。它提供了与当前运行的 Node.js 进程本身及其环境交互的丰富接口。可以把它看作是程序的"控制中心"和"信息中心"。
常用属性
process.argv
: 这是一个数组,包含了启动这个 Node.js 进程时在命令行传入的所有参数。process.env
: 这是一个对象,包含了当前进程的所有环境变量。process.cwd()
: 经常用到! 返回 Node.js 进程启动时所在的当前工作目录 (Current Working Directory)。注意,这和__dirname
(当前脚本文件所在目录)可能不同,尤其是当你从其他地方启动脚本时。process.on(event, listener)
: 允许你监听进程发生的事件。最常用的是监听'exit'
事件(在进程即将退出时触发)或'uncaughtException'
(捕获未处理的异常)。process.exit([code])
: 强制终止当前 Node.js 进程。参数code
是退出码:0
:表示成功退出(正常结束)。- 非
0
(通常是1
):表示异常退出(发生了错误)。
process.pid
: 返回当前 Node.js 进程的唯一标识符(Process ID)。这在需要管理或监控进程时很有用。
3.2 Buffer:高效处理二进制数据的利器
概念
Buffer
是 Node.js 环境独有 的一个全局类。它是专门设计用来在内存中高效地存储和操作原始二进制数据(字节流)的。你可以把它想象成一个专门存放二进制字节的"容器"或"缓冲区"。
JavaScript 最初是为浏览器设计的,主要处理文本(字符串)。Node.js 需要处理文件、网络数据等二进制信息,Buffer
就是为此而生,它让 Node.js 能直接操作内存中的字节。
特性
- 直接内存操作: 可以直接读写内存中的二进制数据,速度很快
- 编码转换: 支持在二进制数据和各种编码格式(如
'utf-8'
,'ascii'
,'base64'
,'hex'
)之间进行转换 - 高效 I/O: 是 Node.js 文件系统 (
fs
) 和网络模块(net
,http
)处理数据的基础
常见方法示例与说明
- 创建
Buffer
实例:Buffer.alloc(size[, fill[, encoding]])
: 创建一个指定大小的新的Buffer
实例,初始内容为零。fill
参数可用于填充缓冲区,encoding
参数指定填充的字符编码。Buffer.from(array)
: 创建一个包含给定数组的Buffer
实例。Buffer.from(string[, encoding])
: 创建一个包含给定字符串的Buffer
实例。
- 读取和写入数据:
buffer[index]
: 通过索引读取或写入Buffer
实例中的特定字节。buffer.length
: 获取Buffer
实例的字节长度。buffer.toString([encoding[, start[, end]]])
: 将Buffer
实例转换为字符串。
- 转换数据:
buffer.toJSON()
: 将Buffer
实例转换为 JSON 对象。buffer.slice([start[, end]])
: 返回一个新的Buffer
实例,其中包含原始Buffer
实例的部分内容。
- 其他方法:
Buffer.isBuffer(obj)
: 检查一个对象是否是Buffer
实例。Buffer.concat(list[, totalLength])
: 将一组Buffer
实例或字节数组连接起来形成一个新的Buffer
实例。
4 File vs Blob vs Buffer
既然讲到了 Buffer,就不得不提一下他们两个了,在前端(浏览器)和后端(Node.js)处理数据,特别是文件或二进制数据时,经常会遇到
File
、Blob
和Buffer
这三个概念。它们容易混淆,下面这张表帮你理清关键区别:
特性 | Buffer (Node.js) | Blob (Browser) | File (Browser) |
---|---|---|---|
运行环境 | Node.js 服务器环境 | 浏览器环境 | 浏览器环境 |
本质 | 内存中的二进制数据缓冲区 (字节数组) | 类文件对象(不可变的原始数据块) | Blob 的子类(不可变 ,附带文件元数据) |
可变性 | 可变 (可以直接修改里面的字节) | 不可变 (创建后内容不能改) | 不可变 (创建后内容不能改) |
创建方式 | Buffer.from() , Buffer.alloc() |
new Blob([arrayOfParts], {type: ...}) |
用户通过 <input> 选择 / new File([parts], name, {type, lastModified}) |
核心属性 | .length (字节长度) |
.size (字节大小), .type (MIME 类型) |
.name (文件名), .size , .type , .lastModified (最后修改时间戳) |
数据访问方式 | 直接索引访问 (e.g., buf[0] ),或者 .toString() , .toJSON() 等方法 |
需要转换 :通过 FileReader 读取为 ArrayBuffer/DataURL/文本,或通过 fetch / Response 处理,或使用 Streams API |
需要转换 :和 Blob 一样,通过 FileReader , fetch / Response , Streams API |
主要用途 | Node.js 核心 I/O、网络通信、二进制处理 | 浏览器中作为通用的二进制数据容器、生成临时 URL (URL.createObjectURL )、文件分片上传 |
表示用户选择的文件、文件上传、访问文件元数据 |
特殊能力 | 底层内存操作、编码转换、高性能二进制处理 | 生成对象 URL (URL.createObjectURL(blob) ) 用于预览或下载 |
提供完整的文件元信息 (名字、类型、大小、修改时间) |