理解 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)) 用于预览或下载 |
提供完整的文件元信息 (名字、类型、大小、修改时间) |