目录 (Outline)
- 一、 加载机制的革命:require(esm) 终于来了
- 二、 性能新引擎:V8 Maglev 编译器深度解析
- 三、 开发者体验:内置 WebSocket 客户端与执行流优化
- 四、 兼容性与迁移指南
- 五、 总结与未来展望
一、 加载机制的革命:require(esm) 终于来了
在 Node.js 22 之前,CommonJS (CJS) 与 ECMAScript Modules (ESM) 的混用一直是社区的「心头大恨」。
1. 历史背景
由于 ESM 是异步加载的,而 CJS 的 require 是同步的,我们一直无法在 CJS 中直接 require 一个 ESM 模块。这迫使大量库作者不得不维护「双包(Dual Package)」,或者强迫用户使用异步的 import()。
2. Node.js 22 的突破
Node.js 22 引入了 --experimental-require-module 标志,允许同步 require() 一个同步执行的 ESM 模块。
3. 实战代码
// cjs-app.js
// 开启 --experimental-require-module 后
const esmModule = require('./my-esm-lib.mjs');
console.log(esmModule.greet());
限制条件:被引用的 ESM 模块不能包含「顶层 await (Top-level await)」,因为 require 必须是同步返回的。
二、 性能新引擎:V8 Maglev 编译器深度解析
Node.js 22 搭载了 V8 12.4 引擎,默认开启了 Maglev 编译器。
1. Maglev 是什么?
在 V8 的架构中,原先只有两级:
- Sparkplug:快速生成的非优化代码。
- Turbofan:极致优化的机器码(生成慢,耗 CPU)。
Maglev 是介于两者之间的「中层编译器」。它能在不消耗过多 CPU 资源的前提下,生成比 Sparkplug 快得多的优化代码。
2. 带来的变化
对于短生命周期的应用(如 Serverless 函数、CLI 工具),Maglev 能显著缩短从启动到达到最佳性能的时间(Warm-up Time)。在大型 Web 服务中,它也能通过分担 Turbofan 的压力来降低整体内存占用。
三、 开发者体验:内置 WebSocket 客户端与执行流优化
1. 原生 WebSocket 支持
继 fetch 之后,Node.js 22 终于将 WebSocket 客户端标记为稳定版。你不再需要安装 ws 库即可发起长连接。
const ws = new WebSocket('ws://example.com/feed');
ws.onopen = () => ws.send('Hello Node.js 22!');
2. node --run 命令
Node.js 22 引入了全新的 --run 标志,用于直接运行 package.json 中的 scripts。它比 npm run 快得多,因为它省去了庞大的 npm 脚本启动开销。
node --run dev
四、 兼容性与迁移指南
- Glob 模式支持:
fs模块现在原生支持递归 glob 模式(fs.readdirSync('.', { recursive: true }))。 - 默认 ESM 加载器:Node.js 22 进一步优化了自定义加载器的钩子,使得 Mock 库和性能分析工具更易实现。
五、 总结与未来展望
Node.js 22 是一个里程碑版本:
- 兼容性:
require(esm)消除了 CJS/ESM 最后一道鸿沟。 - 性能:Maglev 让性能曲线更加平滑。
- 原生化:Web API 的持续补全让 Node.js 更加符合现代标准。
如果你正在维护一个复杂的 Node.js 系统,Node.js 22 LTS 将是你升级的首选。