本周 Node.js 22 版本发布了!亮点包括 require() ES 模块、WebSocket 客户端、V8 JavaScript 引擎的更新等等!
Node.js 22 将于十月进入长期支持(LTS)阶段,但在那之前,它将在接下来的六个月内作为“当前”发布版本。我们鼓励您探索此最新版本提供的新功能和优势,并评估它们对您的应用程序的潜在影响。
该项目在许多领域取得了进展,许多新功能和修复已经流入现有的 LTS 版本。因此,Node.js 22 更新日志中概述的更改仅代表自上一个主要版本发布以来的功能和工作的一小部分。本博客文章将针对这些变更添加一些额外的背景信息。
要下载 Node.js 22.0.0,请访问:https://nodejs.org/download/current/。您可以在 https://nodejs.org/blog/release/v22.0.0 找到发布文章,其中包含此版本中包含的所有提交的完整列表。
V8 升级至 12.4
V8 发布的 12.4 版本包括诸如 WebAssembly 垃圾回收、Array.fromAsync、Set 方法和迭代器助手等新功能。
Maglev
V8 的 Maglev 编译器现在默认启用于支持的架构上(https://v8.dev/blog/maglev)。Maglev 提高了短生命周期 CLI 程序的性能。
由 Keyhan Vakil 贡献于 #51360
支持 require() 同步 ESM 图
此版本在 --experimental-require-module 标志下为同步 ESM 图添加了 require() 支持。
如果启用了 --experimental-require-module,并且被 require() 加载的 ECMAScript 模块满足以下要求:
在最接近的 package.json 或 .mjs 扩展中以 "type": "module" 字段显式标记为 ES 模块。
完全同步(不包含顶层 await)。
require() 将会以 ES 模块的形式加载请求的模块,并返回模块名称空间对象。在这种情况下,它类似于动态 import(),但是是同步运行的,并直接返回名称空间对象。我们打算在将来默认情况下启用 require(esm),而无需该标志。
详细可以看我之前这篇文章:CommonJS 和 ES Module 终于要互相兼容了???
运行 package.json 脚本
Node.js 22 包括一个新的实验性功能,用于使用 cli 标志 node --run <package.json 中的脚本> 执行 package.json 中的脚本。它还支持 node --run test,这会执行 package.json 脚本中的测试命令。
流默认高水位标记
将流的默认高水位标记从 16KiB 增加到 64KiB。这提供了全面的性能提升,但会略微增加内存使用量。鼓励在内存敏感环境中的用户显式设置 setDefaultHighWaterMark
。
监视模式(node --watch)
从此版本开始,监视模式被视为稳定。在监视模式下,监视文件的更改会导致 Node.js 进程重新启动。
WebSocket
WebSocket 的浏览器兼容实现以前被隐藏在标志 --experimental-websocket
后面,现在将默认启用。这为 Node.js 提供了一个无需外部依赖项的 WebSocket 客户端。
glob 和 globSync
此版本在 node:fsmodule 中添加了 glob 和 globSync 函数,用于模式匹配。开发人员现在可以利用这些函数根据指定的模式匹配文件路径。
改进 AbortSignal 创建的性能
此版本提高了创建 AbortSignal 实例的效率,显著改善了 fetch 和测试运行器的性能。
行动呼吁
尝试新的 Node.js 22 版本!我们始终乐意听取您的反馈。使用 Node.js 22 测试您的应用程序和模块有助于确保您的项目与最新的 Node.js 更改和功能的未来兼容性。
另外值得注意的是,Node.js 18 将在 2025 年 4 月结束生命周期,因此我们建议您开始计划升级到 Node.js 20(LTS)或 Node.js 22(即将成为 LTS)。
展望未来,Next-10 团队正在进行一项调查,以收集来自生态系统的信息。通过参与来塑造 Node.js 的未来。在此提交您的反馈 https://linuxfoundation.surveymonkey.com/r/nodenext10survey24
。
本文翻译自 Node.js 官方博客 https://nodejs.org/en/blog/announcements/v22-release-announce