Node.js 22.12.0 LTS 发布解读:require(esm) 默认开启、Buffer 支持可扩容 ArrayBuffer 与 NSS 3.104 证书更新

📅 发布时间:2026/9/18 22:51:13
Node.js 22.12.0 LTS 发布解读:require(esm) 默认开启、Buffer 支持可扩容 ArrayBuffer 与 NSS 3.104 证书更新
Node.js 22.12.0 LTS 发布解读require(esm) 默认开启、Buffer 支持可扩容 ArrayBuffer 与 NSS 3.104 证书更新【免费下载链接】nodejs.orgThe Node.js® Website项目地址: https://gitcode.com/GitHub_Trending/no/nodejs.org本文基于 Node.js 官方站点nodejs.org的 v22.12.0 发布日志 整理而成。该版本于 2024-12-03 发布是 Jod 代号 22.x 主线上的 LTS 版本其核心看点是require(esm)正式脱离命令行 flag 默认启用、Buffer对可扩容ArrayBuffer的原生支持以及根证书库同步至 NSS 3.104。读完本文你将掌握这些新能力的启用方式、检测手段与回退方案并了解该版本在assert、http、net、sqlite等模块中的其他重要变更以及如何校验和下载对应发行包。版本定位与发布背景v22.12.0 属于 Node.js 22.x Jod LTS 系列。在 nodejs.org 网站仓库中各主版本的生命周期状态由 releaseData.mjs 在构建期根据「当前时间是否超过 EOL 日期」以及「最新版本是否处于 LTS 状态」计算得出22.x 在该版本发布时处于 Active LTS长期维护阶段。需要特别说明的是require(esm)、可扩容ArrayBuffer等特性在更早的 v20.x / v22.x 中已作为实验能力存在本版本的关键动作是把它们从「实验开关」推向「默认行为」同时仍保留显式的关闭手段属于典型的「半稳定化」过渡形态。重大变更一require(esm) 默认启用背景与演进路径原生 ES ModuleESM通过require()加载的能力此前在 v20.x 和 v22.x 上需要显式传入--experimental-require-module命令行 flag 才能开启在 v23.x 上则已默认启用。本次 v22.12.0 中该能力在 22.x 上正式不再依赖 flag对应提交为(SEMVER-MINOR) module: unflag --experimental-require-module由 Joyee Cheung 在 PR #55085 中贡献提交哈希58d6871c45。尽管默认开启官方明确标注该特性仍处于实验状态experimental团队希望在完全稳定之前收集更多用户反馈以进行最后的微调。实验警告与回退开关在 v23.x 上当 Node.js 实例首次通过require()遇到原生 ES Module 时会触发一条实验性警告experimental warning除非该require()调用来自包含node_modules的路径——即依赖包内部的 ESM 加载不会反复打扰用户。如果该特性带来回归可以通过--no-experimental-require-module显式禁用作为临时 workaround# 禁用 require(esm)恢复旧行为 node --no-experimental-require-module app.js错误语义的变化启用该特性后require()加载 ESM 将不再抛出ERR_REQUIRE_ESM。但存在一个例外如果被加载的 ES Module 或其依赖中含有顶层awaittop-level await则会抛出ERR_REQUIRE_ASYNC_MODULE因为require()是同步 API无法等待异步模块初始化完成。当require()成功加载 ESM 时返回的对象要么是类似import()返回结果的 ES Module 命名空间对象namespace object要么是 ESM 中通过module.exports互操作导出所得到的内容。运行时检测process.features.require_module开发者可以通过以下方式检测当前 Node.js 实例是否启用了require(esm)console.log(process.features.require_module); // v22.12.0 及之后true默认启用对于 npm 包作者而言更推荐的检测方式是利用module-sync导出条件exports condition。在package.json的exports字段中声明module-sync条件后同一份原生 ES Module 可以同时被require()与import正确加载{ name: dual-package-example, exports: { .: { module-sync: ./index.mjs, require: ./index.cjs, import: ./index.mjs } } }仓库中的配套证据在 v22.12.0.md 发布日志 的提交列表中可以看到该特性相关的整条实现链均为module模块的收尾工作module: check --experimental-require-module separately from detection#55250module: use kNodeModulesRE to detect node_modules#55243module: include module information in require(esm) warning#55397module: allow ESM that failed to be required to be re-imported#55502module: trim off internal stack frames for require(esm) warnings#55496module: do not warn when require(esm) comes from node_modules#55960module: support module.exports interop export in require(esm)#54563module: fix error thrown from require(esm) hitting TLA repeatedly#55520src: implement IsInsideNodeModules() in C#55286这些提交说明该特性在默认化之前专门处理了node_modules路径识别C 层IsInsideNodeModules()、实验警告的信息与堆栈裁剪、顶层 await 反复命中时的错误修复、以及module.exports互操作导出等细节为生产环境使用做了充分铺垫。重大变更二Buffer 支持可扩容 ArrayBuffer变更内容当Buffer基于一个可扩容resizableArrayBuffer创建时Buffer的byteLength会随着底层ArrayBuffer的大小变化而自动同步更新。此前Buffer会固化创建时的长度本版本起二者保持一致。对应实现为(SEMVER-MINOR) buffer: make Buffer work with resizable ArrayBufferJames SnellPR #55377。运行示例原文给出了如下可直接验证的示例const ab new ArrayBuffer(10, { maxByteLength: 20 }); const buffer Buffer.from(ab); console.log(buffer.byteLength); // 10 ab.resize(15); console.log(buffer.byteLength); // 15 ab.resize(5); console.log(buffer.byteLength); // 5要点解析new ArrayBuffer(10, { maxByteLength: 20 })创建初始长度 10、上限 20 的可扩容缓冲区ab.resize(15)/ab.resize(5)动态调整底层容量随着底层容量变化buffer.byteLength分别输出10、15、5证明Buffer长度与底层ArrayBuffer实时联动。这对于需要零拷贝地操作由 Web API如fetch响应体、postMessage传输或流式数据处理产生的可扩容缓冲区的场景非常实用——不再需要手动重建Buffer。重大变更三根证书库更新至 NSS 3.104本版本将内置的根证书root certificates同步至NSS 3.104即 Firefox 131.0发布于 2024-10-01所使用的证书版本。对应提交为crypto: update root certificates to NSS 3.104Richard LauPR #55681。本次新增的根证书共 5 个FIRMAPROFESIONAL CA ROOT-A WEBTWCA CYBER Root CASecureSign Root CA12SecureSign Root CA14SecureSign Root CA15影响面所有依赖 Node.js 内置证书库进行 TLS/HTTPS 校验证书的场景如https模块、fetch、tls.connect等都会自动受益于这些新信任锚点减少因服务端证书链不被信任而导致的UNABLE_TO_VERIFY_LEAF_SIGNATURE类错误。其他值得关注的变更Other Notable Changes除上述三项重大变更外本版本还包含以下值得留意的改动完整信息见 发布日志模块变更类型贡献者 / PRassertassertion_error改用 Myers diff 算法输出差异SEMVER-MINORGiovanni Bucci / #54862doc对 semver-major 版本发布强制执行严格策略—Rafael Gonzaga / #55732doc新增 collaborator jazelly—Jason Zhang / #55531esmimport attributes 与 JSON module 标记为 stable稳定—Nicolò Ribaudo / #55333http新增诊断通道http.client.request.createdSEMVER-MINORMarco Ippolito / #55586lib新增UV_UDP_REUSEPORTUDP socket 复用端口SEMVER-MINORtheanarkh / #55403net新增UV_TCP_REUSEPORTTCP socket 复用端口SEMVER-MINORtheanarkh / #55408sqlitenode:sqlite支持SQLite Session ExtensionSEMVER-MINORBart Louwers / #54181其中两点值得展开1. import attributes 与 JSON 模块转正。ESM 的 import attributeswith { type: json }与 JSON 模块在 v22.12.0 中正式标记为稳定这意味着在 22.x LTS 上可以放心使用如下语法而无需任何 flagimport data from ./config.json with { type: json }; console.log(data);2. TCP/UDP REUSEPORT。UV_TCP_REUSEPORT与UV_UDP_REUSEPORT允许在多个进程/多个 socket 上绑定同一端口配合 cluster 或多进程部署例如 nodejs.org 官网 这类基于 Next.js 的站点在多副本部署时可显著简化端口复用配置。提交明细速览按模块归类该版本包含大量常规提交除上述 SEMVER-MINOR 项外其余多为 bug 修复、文档完善、依赖升级与性能优化。以下按模块提炼代表性内容deps依赖升级undici 6.21.0、c-ares v1.34.3、ICU 76.1、simdutf 5.6.1、sqlite 3.47.0、nghttp2 1.64.0、libuv 1.49.1并回滚了默认禁用 libuv io_uring 的改动、acorn 8.14.0、ada 2.9.1 等assert修复 URL 上deepEqual恒为 true 的问题#50853、区分cause为undefined与缺失的情况#55738、修复deepStrictEqual对 Errorcause的处理#55406cli--heap-profflag 现在可用于NODE_OPTIONS环境变量#54259crypto允许SubtleCrypto.deriveBits在 HKDF / PBKDF2 中使用length0#55866、修正RSA_PKCS1_PADDING错误消息diagnostics_channel修复 publish 过程中 unsubscribe 的竞态问题#55116dns停止使用废弃的ares_query#55430、修复order选项#55392esm修复import.meta.resolve崩溃#55777、修复 resolve hook 中importAssertion的不一致#55365fs修复递归opendir的bufferSize选项#55744、glob 时DirentFromStats的路径传递、Windows 路径改用wstringhttp新增诊断通道http.server.response.created#55622module未编译 amaro 时抛出ERR_NO_TYPESCRIPT#55332、简化--inspect-brk处理node-api新增napi_create_buffer_from_arraybuffer方法#54505sqlite新增readOnly选项#55567、stmt.all()缓存列名#55373、重构 open options#55442stream传播AbortSignal的 reason#55473test_runnermock timers 支持scheduler.wait#55244、对已 mock 的日期再次 mock 时报错#55858、sourcemap 覆盖率需--enable-source-maps#55359urlpathToFileURL重构为原生实现并修复「不安全」字符处理#55476 / #54545util新增util.getSystemErrorMessage(err)#54075、修复util.getCallSites复数形态#55626。完整的逐条提交列表含提交哈希与 PR 链接请参阅 v22.12.0.md 的 Commits 章节。如何获取与校验 v22.12.0下载清单官方为 v22.12.0 提供了覆盖 Windows、macOS、Linux、AIX、ARM 及源码的完整发行物Windows 32-bit Installernode-v22.12.0-x86.msiWindows 64-bit Installernode-v22.12.0-x64.msiWindows ARM 64-bit Installernode-v22.12.0-arm64.msiWindows 32-bit Binarywin-x86/node.exeWindows 64-bit Binarywin-x64/node.exeWindows ARM 64-bit Binarywin-arm64/node.exemacOS 64-bit Installernode-v22.12.0.pkgmacOS Apple Silicon 64-bit Binarynode-v22.12.0-darwin-arm64.tar.gzmacOS Intel 64-bit Binarynode-v22.12.0-darwin-x64.tar.gzLinux 64-bit Binarynode-v22.12.0-linux-x64.tar.xzLinux PPC LE 64-bit Binarynode-v22.12.0-linux-ppc64le.tar.xzLinux s390x 64-bit Binarynode-v22.12.0-linux-s390x.tar.xzAIX 64-bit Binarynode-v22.12.0-aix-ppc64.tar.gzARMv7 32-bit Binarynode-v22.12.0-linux-armv7l.tar.xzARMv8 64-bit Binarynode-v22.12.0-linux-arm64.tar.xzSource Codenode-v22.12.0.tar.gz说明官方下载地址统一位于https://nodejs.org/dist/v22.12.0/API 文档位于https://nodejs.org/docs/v22.12.0/api/正式发布博文中的下载链接正是由 downloadsTable.mjs 依据版本号模板生成的。SHASUMS 完整性校验发布日志附带了以 PGP 签名的SHASUMS256.txt内容SHA-256 哈希清单用于验证下载文件的完整性。推荐校验流程# 1. 下载对应发行物与 SHASUMS 清单 curl -sO https://nodejs.org/dist/v22.12.0/SHASUMS256.txt.asc curl -sO https://nodejs.org/dist/v22.12.0/node-v22.12.0-linux-x64.tar.xz # 2. 校验文件的 SHA-256 是否与清单一致 grep node-v22.12.0-linux-x64.tar.xz SHASUMS256.txt.asc | sha256sum -c - # 3. 可选导入 Node.js 发布团队 GPG 公钥后验证签名 gpg --verify SHASUMS256.txt.asc发布日志中的哈希清单同时覆盖.msi、.pkg、.tar.gz、.tar.xz、.zip、.7z以及 Windows 的node.exe/node.lib/node_pdb等全部产物例如22982235e1b71fa8850f82edd09cdae7e3f32df1764a9ec298c72d25ef2c164f node-v22.12.0-linux-x64.tar.xz 3157e7c002b6e964bdbefb331ec38db1e2dceb064ab11c038275155461b22ce3 node-v22.12.0.tar.gz 5fa43604523be95f8e73c4c98337a5c2bf02450a6525ad25ec2926e464e6bcef node-v22.12.0-x64.msi发布博文是如何生成的仓库视角这份发布日志本身也展示了 nodejs.org 网站的自动化工作流。仓库中的 release-post/index.mjs 脚本会从 Node.js changelog、GitHub 用户资料、SHASUMS256.txt.asc与 dist 目录自动抓取数据拼接出「Notable Changes 提交列表 下载链接 SHASUMS」的完整草稿写入pages/en/blog/release/vversion.md# 在仓库 apps/site 目录下为指定版本生成发布博文 node scripts/release-post/index.mjs 22.12.0其关键步骤包括从CHANGELOG_V22.md中按a id22.12.0/a锚点截取版本小节fetchChangelog、解析版本策略Stable / LTSfetchVersionPolicy、通过 HEAD 请求逐个验证下载链接是否存在verifyDownloads并用 Handlebars 模板渲染后交给 Prettier 格式化。而 blog-data/generate.mjs 则在构建期读取全部博文 frontmatter为每篇博文生成release、year-2024、all等分类索引供 BlogPostCard 在博客列表页展示。小结与升级建议v22.12.0 是 22.x LTS 线上一个「默认化」味道浓郁的版本require(esm)让 CJS/ESM 双格式包的路由更加平滑可扩容ArrayBuffer打通了Buffer与现代 Web 缓冲区的联动NSS 3.104 则补全了 TLS 信任链。对于 22.x 用户升级到 v22.12.0 即可在无需改动代码的情况下获得上述能力对于包作者建议尽快在exports中声明module-sync条件以同时兼容require()与import若遇到require(esm)引发的回归--no-experimental-require-module是官方提供的即时回退手段。【免费下载链接】nodejs.orgThe Node.js® Website项目地址: https://gitcode.com/GitHub_Trending/no/nodejs.org创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考