资讯动态

Node.js 18.19.0 “Hydrogen“ LTS 发布全解析:npm 10 回溯、ESM 定制钩子体系重构与测试运行器增强

发布时间:2026/9/18 21:47:25 来源:尧图企业网站定制
Node.js 18.19.0 Hydrogen LTS 发布全解析npm 10 回溯、ESM 定制钩子体系重构与测试运行器增强【免费下载链接】nodejs.orgThe Node.js® Website项目地址: https://gitcode.com/GitHub_Trending/no/nodejs.org2023 年 11 月 29 日Node.js 发布了 18.x 主线上的重要 LTS 版本18.19.0 Hydrogen由 Michaël Zasso 以targos名义发布。这是 Node.js 18 生命周期中一次承前启后的里程碑它首次将npm 10回溯到 18 号线让所有仍在维护的发布线都拥有受支持的 npm 版本同时把 Node.js 20 中沉淀下来的ESM 模块定制钩子体系registerAPI、initialize钩子、import.meta.resolve去实验化、--experimental-default-type标志整体回迁并大幅增强了内置测试运行器的能力。本文以 nodejs.org 官网仓库中的 v18.19.0 发布说明 为骨架结合该仓库对发布博客的解析与版本数据生成逻辑逐项拆解本次发布的 Notable Changes、ESM 钩子迁移路径、测试运行器新特性、下载与校验和验证方法帮助你评估是否升级、如何平滑迁移。版本背景为何 18.19.0 值得关注先看发布说明的元信息date: 2023-11-29T17:28:42.041Z category: release title: Node.js 18.19.0 (LTS) layout: blog-post author: Michaël Zasso在 nodejs.org 仓库中这类发布说明统一存放在apps/site/pages/en/blog/release/目录下截至本文写作时该目录包含自 v0.10.0 以来的数百篇发布博客见 apps/site/pages/en/blog/release。每一篇的category: releasefrontmatter 决定了它的归档分类与 URL。仓库通过 scripts/blog-data/generate.mjs 流式读取这些文件的 frontmatter以category字段缺省为uncategorized和发布年份共同组成分类集合[category, year-年份, all]依据category 文件名生成博客 slug即/blog/release/v18.19.0前端再通过 util/blog.ts 中的mapBlogCategoryToPreviewType将release类别映射为发布预览卡片类型在博客列表与首页聚合展示。也就是说你在官网上看到的这篇发布公告其内容骨架正是本文将要展开的这份文档。本次版本的主要亮点可归纳为四条主线npm 10 回溯、ESM 与定制钩子customization hooks体系变更、测试运行器test_runner增强、以及一批SEMVER-MINOR 级的 API/依赖更新。npm 升级到 v10全发布线统一支持After two months of baking time in Node.js 20, npm 10 is backported, so that all release lines include a supported version of npm. This release includes npm v10.2.3.发布说明明确指出npm 10 已在 Node.js 20 中烘烤baking两个月本次将其回溯backport到 18 号线使得所有仍在维护的发布线都包含受支持的 npm 版本。本次随附的 npm 具体版本为10.2.3。从版本数据生成器 next-data/generators/releaseData.mjs 可以看到每个主版本的latestVersion.dependencies.npm会被抽取出来用于官网下载页展示各版本线对应的 npm 版本对应的数据结构定义在 types/releases.tsMinorVersion中的npm?: string字段。这意味着升级到 18.19.0 后npm -v将直接得到 10.2.x 的新体验包括 npm 10 引入的安装输出、overrides行为以及lockfileVersion处理上的变化。需要留意的是npm 10 要求 Node.js 满足其自身引擎约束因此在 18.19.0 上运行 npm 10 属于官方设计内的组合若你的 CI 或生产环境对 npm 版本有严格锁定如通过corepack或packageManager字段固定升级前应先在目标环境中验证npm install与锁文件的兼容性。ESM 与模块定制钩子customization hooks变更这一节是本次发布说明中篇幅最大、技术含量最高的部分涉及四项核心变更全部来自 Node.js 20 的沉淀回迁。1. Loaders 现在会作用于后续的 loaderLoaders now apply to subsequent loaders, for example:--experimental-loader ts-node --experimental-loader loader-written-in-typescript.在此之前通过--experimental-loader链式加载多个 loader 时后续 loader 的加载过程不会经过前面 loader 的解析流程导致用 TypeScript 写的 loader 无法被 ts-node 这类 loader 加载。本次修复后loader 解析是**级联cascade**的node --experimental-loader ts-node --experimental-loader loader-written-in-typescript ./app.js即第二个 loaderloader-written-in-typescript会先经过第一个 loaderts-node的转换再被执行。这一点对 ts-node、tsx 等工具链的 loader 组合使用场景非常关键。该改动由 Maël Nison 贡献PR #43772。2. 新增node:module的registerAPI 与initialize钩子There is a new APIregisteravailable onnode:moduleto specify a file that exports module customization hooks, and pass data to the hooks, and establish communication channels with them.这是本次 ESM 变更中影响最深远的架构调整此前指定定制钩子文件只能通过命令行标志--experimental-loader完成自 Node.js 20.0.0 起钩子被移入独立的线程hooks thread执行因此需要一个在主线程与钩子线程之间建立通信通道的方式新的registerAPI 允许从主线程调用指定导出模块定制钩子的文件、向钩子传递数据并可通过传递MessageChannel实例建立双向通信。官方推荐的新式用法是结合--import使用registernode --import ./file-that-calls-register.js ./app.js其中file-that-calls-register.js内部调用register来装载钩子。使用--import可以保证定制钩子在任何应用代码包括入口文件本身运行之前注册完毕。这一迁移路径的核心价值在于--experimental-loader只解决指定钩子文件的问题而无法在应用启动早期与运行在独立线程中的钩子建立通信register则补全了这一点。该 API 由多个 PR 协作完成#46826、#48842、#48559并配套实现了新的initialize钩子#48842用于在钩子线程启动时执行初始化逻辑、接收主线程通过register传入的数据。发布说明还提示自定义 loader 场景下import.meta.resolve存在一些限制相关文档改动见 #49242。3.import.meta.resolve取消实验标志In ES modules,import.meta.resolve(specifier)can be used to get an absolute URL string to whichspecifierresolves, similar torequire.resolvein CommonJS.在 ES 模块中import.meta.resolve(specifier)现在可以直接使用而无需任何实验标志它返回specifier解析后的绝对 URL 字符串功能上对标 CommonJS 的require.resolve。这一变化让 Node.js 在模块解析能力上与浏览器及其他服务端运行时保持一致是 ESM 生态走向成熟的重要标志由 Guy Bedford 贡献PR #49028。一个直观的对比// CommonJS require.resolve(node:fs); // 得到绝对路径/URL 字符串 // ES Modules18.19.0 起无需 flag import.meta.resolve(node:fs); // 得到 file:///.../fs.mjs 形式的绝对 URL4. 新增--experimental-default-type标志翻转模块默认类型The new flag--experimental-default-typecan be used to flip the default module system used by Node.js.--experimental-default-type允许翻转 Node.js 默认采用的模块系统。显式声明为 ESM 或 CommonJS 的输入不受影响这些显式声明包括package.json中的type字段.mjs/.cjs文件扩展名--input-type标志。而在--experimental-default-typemodule下原本隐式按 CommonJS 处理的内容将按 ES 模块解释具体涉及三类输入通过--eval或 STDIN 提供的字符串输入且未指定--input-type以.js结尾或无扩展名的文件且当前目录及所有父目录中都不存在package.json以.js结尾或无扩展名的文件其最近父级package.json缺少type字段位于node_modules内的除外。此外还有一个联动细节当同时传入--experimental-wasm-modules时无扩展名的文件如果包含 Wasm magic bytes 头将被解释为 Wasm 模块。该标志由 Geoffrey Booth 贡献PR #49869其实现还包括在--default-type下绕过 CommonJS loader#49986与模块作用域内去标志化无扩展名 JavaScript 与 Wasm#49974等配套改动。5. 其他 ESM 相关变更发布说明还列出若干值得关注的 ESM 侧改动import attributes 取代 import assertionsESM 与vm模块均改用 import attributes 语法#50140、#50141这是对 TC39 提案演进的跟进assert关键字相关用法需要注意迁移loaders 文档章节移动与重命名#49261一批与register行为相关的修复例如支持URL实例作为注册目标#49655、移除Module.register的返回值#49529、修复全局预加载globalPreload警告等。从提交历史看本次还移除了对已废弃钩子的支持#47580并将钩子执行迁入独立线程#44710这是 Node.js 20 架构决策的回迁基础。如果你仍在使用基于旧钩子 API 的 loader升级到 18.19.0 时应同步迁移到register 新钩子签名。测试运行器test_runner大幅增强Node.js 18.19.0 将内置测试运行器在 20 号线上的多项改进整体回迁backport以下是发布说明中列出的全部新增能力能力说明类型testOnlyinrunrun()方法接受testOnly选项可只执行标记为only的测试SEMVER-MINORJUnit Reporter新增 JUnit 格式报告器便于对接 Jenkins 等 CI 系统SEMVER-MINOR测试位置暴露向外部暴露测试在源文件中的位置location信息SEMVER-MINORShards 支持支持将测试集按分片shard切分适合分布式并行执行SEMVER-MINORfakeTimers 初版内置 mock 定时器MockTimers的初始版本支持setImmediate等SEMVER-MINOR--test-concurrency标志CLI 新增并发度控制标志可限制测试文件并发执行数SEMVER-MINOR以--test-concurrency为例其 CLI 形态为node --test --test-concurrency4该标志与run()编程式 API 配合可以让开发者精细控制测试执行对 CPU 资源的占用而 shards 支持则让大型测试集可以按--test-shard1/4之类的方式拆分到多台 CI 机器并行执行。MockTimers初版则允许在测试中模拟setTimeout、setInterval、setImmediate等定时器行为减少对真实时间的依赖相关提交还包含对Symbol.dispose的支持。配套的修复与打磨还包括spec报告器对todo/only的处理、全局before/after钩子的执行时机修正、test:fail事件类型修正、以及测试失败时退出码行为的调整等。对于在 18 号线上希望获得更现代测试体验的团队18.19.0 之后内置测试运行器的可用性已显著提升。其他值得注意的变更发布说明的 Other notable changes 还包含多项SEMVER-MINOR更新uvwasi 升级到 0.0.19#49908并为wasi模块同步引入了适配最新 uvwasi 的更新#49908streamReadable 状态改用 bitmap 表示#49745这是对可读流内部状态管理的一次结构性优化lib新增 API 检测 source maps 是否启用#46391便于工具链在运行时感知--enable-source-maps状态lib为diagnostics_channel新增 tracing channel#44943进一步强化 Node.js 内置可观测性能力src新增cjs_module_lexer_version与base64_version#45629tls新增ALPNCallback服务端选项支持动态 ALPN 协商#45190允许在 TLS 握手过程中根据客户端提供的协议列表动态选择应用层协议如 HTTP/2 与 HTTP/1.1 的运行时抉择。此外依赖侧还同步升级了 OpenSSL 3.0.12quic1、c-ares 1.20.1、corepack 0.22.0、simdutf、ada 等多个组件并修复了child_process在 Linux 上的 spawn 性能#48523等实际问题。完整的提交清单数百条按bootstrap、build、deps、doc、esm、test_runner、tools等模块组织的 commit可查阅 v18.19.0 发布说明 原文。下载资源与校验和验证发布说明末尾附带了完整的官方下载清单覆盖 Windows、macOS、Linux、AIX 与源码包。主要分发物包括平台分发物Windowsx86/x64 的.msi安装器、node.exe二进制、.7z/.zip压缩包macOS通用.pkg安装器、Apple Siliconarm64与 Intelx64二进制Linuxx64、PPC LE 64-bit、s390x、ARMv7 32-bit、ARMv8 64-bit 二进制AIXppc64 二进制通用源码包.tar.gz、headers 包、node.lib等开发用文件所有文件均位于官方发布目录nodejs.org/dist/v18.19.0/并提供了对应的SHA256 校验和列表。例如 Linux x64 压缩包的校验和为153312ae9fe8684f345100e4d141a521dc542b36d8c1e09c31ac290eae98c62a node-v18.19.0-linux-x64.tar.gz 61632bb78ee828d6e8f42adc0bc2238a6b8200007093988d3927176a372281e8 node-v18.19.0-linux-x64.tar.xz校验和列表以PGP 签名消息形式呈现-----BEGIN PGP SIGNED MESSAGE-----到-----END PGP SIGNATURE-----这意味着校验和文件本身经过 Node.js 发布团队的 PGP 签名可防止校验和被篡改。完整清单含 Windows、macOS、AIX、headers 等全部条目及签名块可直接在 v18.19.0.md 中核对。总结与升级建议Node.js 18.19.0 Hydrogen 是 18 号线后期一次高价值的功能回迁npm 用户将随版本获得 npm 10.2.3注意验证锁文件与 CI 流程ESM 生态维护者应尽快将--experimental-loader用法迁移到--importregister并适配 import attributes 与去标志化的import.meta.resolve测试工程团队可以开始用内置测试运行器的 shards、JUnit 报告器与--test-concurrency增强 CI 效率服务端团队可关注ALPNCallback与diagnostics_channeltracing channel 带来的协议协商与可观测性能力。在 nodejs.org 仓库中你还可以继续探索发布博客的 frontmatter 解析与分类逻辑scripts/blog-data/generate.mjs、发布类别在前端的预览映射util/blog.ts、以及各版本线的 npm/V8 版本数据生成next-data/generators/releaseData.mjs从而完整理解版本发布 → 官网呈现的全链路。【免费下载链接】nodejs.orgThe Node.js® Website项目地址: https://gitcode.com/GitHub_Trending/no/nodejs.org创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价