本文档描述了 Node.js 的高层架构,重点关注其核心组件以及它们如何交互。它概述了构成 Node.js 的主要系统、它们的职责以及它们之间的关系。有关特定组件的更详细信息,请参阅相应的页面,例如 V8 集成、环境和启动过程、工作线程架构或 模块系统。
Node.js 构建于几个关键组件之上,这些组件协同工作以提供其运行时环境。
来源
Node.js 通过 C++ 绑定层将 V8 JavaScript 引擎与平台无关的异步 I/O 库 (libuv) 结合起来。这使得 JavaScript 能够以非阻塞方式与文件系统、网络和定时器等系统资源进行交互。
Node.js 的启动过程涉及几个关键步骤来设置运行时环境。
来源
初始化过程涉及几个关键步骤:
来源
Node.js 使用两个关键类来管理其运行时状态:
IsolateData:包含同一 V8 Isolate 中多个环境共享的数据,包括:
Environment:代表一个完整的 JavaScript 执行上下文,具有自己的:
AsyncHooks 跟踪异步资源ImmediateInfo 和 TickInfo 进行定时器和立即回调每个 Node.js 进程至少有一个主 Environment 实例。工作线程和其他隔离上下文可能存在其他 Environment 实例。
Node.js 将 libuv 事件循环与 V8 的执行模型集成。
来源
事件循环是 Node.js 非阻塞 I/O 模型的核心。
Node.js 使用各种 handle 集成到 libuv 的事件循环中:
uv_timer_t 用于定时器 (setTimeout/setInterval)uv_check_t 用于立即回调 (setImmediate)process.nextTick() 不使用 libuv 事件循环,但在 libuv 阶段之间处理。
Promise 微任务在 V8 中每个“微任务检查点”之后处理。
Node.js 通过与 V8 的集成来仔细管理内存。
| 组件 | 职责 |
|---|---|
NodeArrayBufferAllocator | 用于 ArrayBuffer 的自定义分配器 |
DebuggingArrayBufferAllocator | 用于跟踪内存分配的调试版本 |
SetIsolateCreateParamsForNode | 根据可用内存配置 V8 堆大小 |
SetIsolateUpForNode | 设置用于错误处理、Promise 拒绝等的 callback |
AsyncWrap | 跟踪异步资源以进行调试和性能分析 |
HandleWrap | 所有 libuv handle 包装器的基类 |
来源
内存管理包括:
Node.js 的行为可以通过各种编译和运行时标志来控制。
来源
Node.js 提供了广泛的配置选项:
ProcessGlobalArgs 解析的命令行参数NODE_OPTIONSNode.js 包含一个快照系统以提高启动性能。
来源
快照系统
Node.js 通过 Worker Threads API 支持多线程。
来源
Node.js 中的工作线程
SharedArrayBuffer 与主线程共享某些数据Node.js 使用复杂的引导过程来设置其 JavaScript 环境。
| 阶段 | 入口点 | 描述 |
|---|---|---|
| 1. 平台设置 | node.cc main | 设置 V8 平台并处理参数 |
| 2. Isolate 创建 | NewIsolate() | 创建并初始化 V8 Isolate |
| 3. Environment 创建 | CreateEnvironment() | 创建 Node.js 环境和上下文 |
| 4. Node.js 引导 | StartExecution() | 运行引导 JavaScript 代码 |
| 5. Context 初始化 | internal/bootstrap/node.js | 设置全局对象和核心模块 |
| 6. 入口点选择 | StartExecution() | 选择主脚本或 REPL 执行 |
来源
引导过程连接了 C++ 和 JavaScript 功能。
Node.js 包含丰富的内置模块集。
来源
Node.js 内置模块系统
Node.js 核心架构提供了几项重要功能
该架构使 JavaScript 代码能够高效地与操作系统资源进行交互,同时保持 Node.js 所熟知的异步、事件驱动的编程模型。