Node.js v24.3.0 发布详解:type stripping 转正、test_runner 对象属性 mock 与 fileURLToPathBuffer 新 API
【免费下载链接】nodejs.orgThe Node.js® Website项目地址: https://gitcode.com/GitHub_Trending/no/nodejs.org
Node.js v24.3.0(Current 版本线)于 2025-06-24 正式发布。本篇文章以官方发布公告(apps/site/pages/en/blog/release/v24.3.0.md)为骨架,逐条拆解本次版本的 Notable Changes、核心依赖升级与修复细节,并结合本仓库(nodejs.org 官网源码)说明发布公告是如何被自动生成、以及下载页面如何组织各平台安装包,帮助你快速判断该版本是否值得升级、以及如何正确安装与校验。
版本背景:Current 版本线的定位
v24.3.0 属于 Node.js 24 主版本的第三个 minor 版本,发布于 2025-06-24,发布人为 Rafael Gonzaga(@RafaelGSS)。在 Node.js 的发布策略中,24.x 线当前处于Current(当前版本)状态,尚未进入 LTS。
在本仓库的 releaseData.mjs 中,getNodeReleaseStatus函数依据“是否已过 EOL 日期、最新版本是否处于 LTS 阶段”两个条件,将每个主版本的 status 判定为EOL/LTS/Current三者之一:
const getNodeReleaseStatus = (latest, eol) => { const now = new Date(); if (eol && now >= new Date(eol)) { return 'EOL'; } if (latest.lts.isLts) { return 'LTS'; } return 'Current'; };也就是说,v24.3.0 的 (Current) 标签并非人工书写,而是由官网数据层根据 release schedule 数据自动推导并在下载页面上呈现的。生产环境如需长期稳定支持,应优先关注 LTS 版本线。
Notable Changes:本次版本四大亮点
v24.3.0 的 Notable Changes 共包含 8 条变更,其中 4 条带有(SEMVER-MINOR)标记(即向后兼容的新功能),是本次升级的核心看点。
1. module:type stripping 移除实验警告(SEMVER-MINOR)
- 提交:
9b28f40834,PR #58643,作者 Marco Ippolito - 影响模块:module
从 Node.js 22.6.0 引入的类型剥离(type stripping)能力,在本版本中移除了实验性警告。这意味着直接运行.ts文件(类型标注被安全剥离,无需编译)已从实验阶段走向稳定可用,开发者可以更干净地在 Node.js 中直接执行 TypeScript 文件。
围绕 TypeScript 支持,本次还包含若干配套修复:
ff8a3691c4(PR #58661):修复 TypeScript 下的import.meta.main;45f7d160ed(PR #58657):重构 CommonJS 的 TypeScript 加载器(refactor commonjs typescript loader);7bb1246c8f(PR #58732):为 hooks 中的 TS 支持补充 history 条目;b6760b3379(PR #57419):将ModuleLoader.load的默认路径 syncify,属于 ESM 加载器内部一致性调整。
同时依赖侧同步升级了类型剥离所用到的 amaro(从 1.0.0 升至 1.1.0,见提交fa6854f083与450f4815b3),说明本次对 TS 支持的处理是成体系的。
2. fs:fs-events 在 AsyncIterator 下正确处理 burst(SEMVER-MINOR)
- 提交:
839964ece8,PR #58490,作者 Philipp Dunkel - 影响模块:fs
fs.Dir/ 目录遍历等基于AsyncIterator的场景,在事件突发(burst)时可能出现错误处理,本次修复允许 fs-events 与 AsyncIterator 组合时正确消化突发事件。同模块的配套清理还包括:
96c78d726c(PR #58692):使Dirdisposers 幂等(重复调用不会重复清理);62b5879d88(PR #58728):避免在运行时重复计算时间系数常量;af18c0e81a(PR #58418):移除 glob 中的 IIFE;fb4378b72e(PR #56918):将UV_ENOSPC加入直接透传 err 的列表(磁盘写满场景的错误信息将更准确)。
3. test_runner:支持对象属性 mock(SEMVER-MINOR)
- 提交:
713fbad7b6,PR #58438,作者 Idan Goshen - 影响模块:test_runner
node:test 测试运行器新增对象属性 mocking能力,允许对对象的属性进行 mock,进一步增强了内置测试框架的能力,减少了项目对第三方 mock 库的依赖。
test_runner 模块在本次发布中还经历了一次“反转再确认”:
6ef7329c8c(PR #58282):Revert「自动等待 subtests 完成」;dce1995c55、8b0c5edbb6(PR #58282):Revert「移除 t.test() / test() 返回的 promises」;a1529d5d99(PR #58800):随后又重新实现「自动等待 subtests 完成」;c9e7b5e43a(PR #58716):test_runner 内部改用Atomicsprimordials。
这些来回的 revert 说明 Node.js 团队在调整 test_runner 的异步语义时非常谨慎,最终保留并重新实现了 subtest 自动等待机制。配套 typings 变更17df800b90(PR #58577)为Atomicsprimordials 补充了类型声明。
4. url:新增 fileURLToPathBuffer API(SEMVER-MINOR)
- 提交:
ef0230abaf,PR #58700,作者 James M Snell - 影响模块:url
url模块新增fileURLToPathBufferAPI。与现有的fileURLToPath(返回字符串路径)不同,该 API 直接返回Buffer形式的文件路径,在高频路径转换场景下可减少字符串与 Buffer 之间的转换开销,适合与fs系列 API 直接衔接使用。
Commits 全量速览:按模块分类
除上述 Notable Changes 外,v24.3.0 还包含大量常规提交,按模块归类如下(均为发布公告原文收录内容)。
依赖升级(deps)
| 依赖 | 目标版本 | PR |
|---|---|---|
| nghttp2 | 1.66.0 | #58786 |
| acorn | 8.15.0 | #58711 |
| amaro | 1.1.0 | #58754 |
| npm | 11.4.2 | #58696 |
| sqlite | 3.50.1 | #58630 |
| simdjson | 3.13.0 | #58629 |
| zlib | 1.3.1-470d3a2 | #58628 |
| V8 | cherry-picke3df60f3f5ab | #58691 |
其中 npm 升级到11.4.2对日常使用影响最直接;sqlite(node:sqlite内置模块所依赖)升至 3.50.1;V8 的 cherry-pick 配合lib,src中的 DOMException 序列化/反序列化支持(6390f70da2、081c70878f,PR #58649)一起合入。
文档(doc)与元数据(meta)
841609ac1c(PR #58714):新增 collaborator islandryu(Shima Ryuhei);97fbfd82af(PR #58783):修复 stability 1.x 链接(排除小数位数字);e2e88d4971(PR #58753):修正 http2 中错误的 RFC 编号;d59680348e(PR #58604):补充 package.jsonexports目标的路径规则与校验文档;4c2c100f63(PR #58790):为 inspector 增加 @nodejs/inspector codeowner。
HTTP / HTTP2
c9dc0a8903(PR #58178):修复 keep-alive 在请求后空行之后不超时的问题(作者正是新 collaborator Shima Ryuhei);b11da1115e(PR #58669):修复 DEP0194 提示信息;b1f60d2f18(PR #58602):http2 新增 diagnostics channelhttp2.server.stream.close,便于观测流关闭事件。
ESM / module / REPL
a3c7a63c73(PR #58598):允许 ESM loader 的 CJS 处理中require()出现循环依赖;d0e42ffa58(PR #58653):REPL tab 补全中避免使用已废弃的require.extensions;82b18ba890(PR #58709):修复 REPL tab 补全在 computed string 属性上失效的问题。
内部实现(src / lib / util)
a0b1378a20(PR #58758):spawn 的权限检查中传递 resource(配合 permission 机制);dfb0144490(PR #58677):增强未知命令行选项的错误提示;74983832f9(PR #58765):validateInternalField()改为抛出ERR_INVALID_THIS;6f7b89516f(PR #58196):util.inspect在 Error 的 stack 自引用时不再崩溃。
测试与工具链
9df1cfe402(PR #58752):nodedownload 工具兼容 Python 3.14;b22e970774(PR #58623):工具链切换到@stylistic/eslint-plugin;- 大量 test 提交聚焦于:REPL 自定义 eval 与 save-load 测试(
704b1fa075、d9c2b7054b)、大 Buffer 分配测试的 deflake(3faa4e8b56、d94b184700、6e0ee39b6d)、WPT 同步(urlpattern / dom-abort / es-exceptions,见94e53d4f6c、fa089d610f、76e3c8aaf2)等。
安装 v24.3.0:各平台安装包与二进制
发布公告末尾列出了官方分发的全部安装包与二进制,涵盖 Windows、macOS、Linux、AIX 与源码包:
| 平台 | 文件 | 说明 |
|---|---|---|
| Windows x64 | node-v24.3.0-x64.msi | 64 位安装器 |
| Windows ARM64 | node-v24.3.0-arm64.msi | ARM 64 位安装器 |
| Windows x64 / ARM64 | win-x64/node.exe、win-arm64/node.exe | 免安装二进制 |
| macOS | node-v24.3.0.pkg | 安装器 |
| macOS Apple Silicon | node-v24.3.0-darwin-arm64.tar.gz | 二进制包 |
| macOS Intel | node-v24.3.0-darwin-x64.tar.gz | 二进制包 |
| Linux x64 | node-v24.3.0-linux-x64.tar.xz | 二进制包 |
| Linux PPC LE | node-v24.3.0-linux-ppc64le.tar.xz | 二进制包 |
| Linux s390x | node-v24.3.0-linux-s390x.tar.xz | 二进制包 |
| AIX | node-v24.3.0-aix-ppc64.tar.gz | 二进制包 |
| ARMv8 64-bit | node-v24.3.0-linux-arm64.tar.xz | 二进制包 |
| Source Code | node-v24.3.0.tar.gz | 源码包 |
所有文件统一位于https://nodejs.org/dist/v24.3.0/,API 文档位于https://nodejs.org/docs/v24.3.0/api/。
值得说明的是,这份下载清单在官网代码中并非手工维护,而是由 downloadsTable.mjs 根据版本号动态筛选生成。该表内置了 16 个下载项模板,并按语义化版本规则裁剪不适用的平台,例如:
- 版本>= 23.0.0时移除 Windows 32 位安装器与二进制(
downloadsTable.mjs#L102-L108); - 版本>= 24.0.0时移除 ARMv7 32 位二进制(
downloadsTable.mjs#L110-L112)。
这正是 v24.3.0 公告中不再出现 32 位 Windows / ARMv7 条目的原因。下载链接通过%version%占位符替换生成:
const resolveUrl = (item, version) => { const url = item.templateUrl.replace(/%version%/g, version); return Object.assign({ url }, item); };发布公告正文中每行末尾的\连字符、*Coming soon*兜底逻辑,则来自 index.mjs 的urlOrComingSoon:脚本会先对每个下载地址发起 HEAD 请求,只有确认可达才写入链接,否则标记为 Coming soon。
使用版本管理器安装(推荐)
如果希望在一台机器上自由切换 Node.js 版本,可以使用 nvm。官网为各包管理器提供了可直接使用的安装脚本片段(见 snippets/en/download/nvm.bash):
# Download and install nvm: curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.6/install.sh | bash # in lieu of restarting the shell \. "$HOME/.nvm/nvm.sh" # Download and install Node.js: nvm install 24nvm install 24会安装 24.x 线的最新版本。此外,仓库的 snippets/en/download 目录还提供了 brew(macOS)、choco(Windows)、fnm、n、asdf、docker 以及 npm/yarn/pnpm/corepack 等多种安装方式的脚本,下载页面 会通过<Release.InstallationMethodDropdown />与<Release.PackageManagerDropdown />让访问者按需切换。
通过官网下载页面获取
nodejs.org 下载页 由layout: download驱动,页面中的版本下拉框由<Release.VersionDropdown />渲染,当前最新版本数据由 releaseVersions.mjs 在构建期根据各 major 的 releases 记录汇总生成(v${release.semver.raw})。对于 v24.3.0 这样的具体版本,你还可以在页面上直接点击<Release.BlogPostLink>(组件实现见 BlogPostLink.tsx)跳转到本文对应的/blog/release/v24.3.0发布博客,或通过<Release.ChangelogLink>查看 changelog。
安全校验:使用 PGP 签名的 SHASUMS 验证下载
发布公告末尾附带了完整的SHASUMS256.txt.asc内容(PGP 签名消息),覆盖了所有分发文件的 SHA-256 哈希,例如:
8dba56a4ecdfac96cb659d153fce30e7718829cb414d4d853cea9f00a6223362 node-v24.3.0-aix-ppc64.tar.gz a962afadaa8b94bae8bff87ddd6c11f7aae621032424ef05c0a4fe2537fa4de0 node-v24.3.0-linux-x64.tar.xz f8cc1dcde9b76fa380765204fefbb98e51123e52c919ba4adcf4ccd235bbf70b node-v24.3.0.tar.gz这些哈希来自 fetchShasums 实时抓取的https://nodejs.org/dist/v24.3.0/SHASUMS256.txt.asc,并被直接嵌入发布公告。校验步骤为:
- 下载目标二进制与对应的
SHASUMS256.txt.asc; - 用
gpg验证签名,确认哈希文件确实由 Node.js 发布团队签名; - 比对下载文件的 SHA-256 与公告中的哈希值是否一致。
官网下载页也明确引导用户「Learn how to verify signed SHASUMS」(见 apps/site/pages/en/download/index.mdx),对于生产环境部署,这一步不应省略。
发布公告是如何生成的:仓库源码揭秘
本文档(以及本仓库pages/en/blog/release/下全部 804 篇发布博客)并非纯手工撰写,而是由 scripts/release-post/index.mjs 自动拼装生成。其执行流程为:
指定版本号(缺省时抓取 dist/index.json 的最新版本) → 抓取 nodejs/node 仓库 CHANGELOG_V24.md 中对应版本小节 → 从发布标题正则解析 @author 与版本策略(Current/LTS) → 抓取 SHASUMS256.txt.asc → 逐个 HEAD 探测下载链接可达性 → 用 Handlebars 渲染 template.hbs → prettier 格式化 → 写入 v24.3.0.md其中版本策略的解析依赖正则/^## ?\d{4}-\d{2}-\d{2}, Version [^(].*\(([^)]+)\)/(index.mjs),这解释了为何公告标题中会出现(Current)后缀——它源自 changelog 原始标题,与官网数据层 releaseData.mjs 的 status 判定是两套相互独立的机制。
template.hbs 定义了最终博客的 frontmatter 与正文骨架:date、category、title、layout、author,随后依次输出 changelog 正文、下载清单、Other release files/Documentation链接以及 SHASUMS 代码块——与 v24.3.0.md 的实际结构完全一致。
升级建议与小结
综合来看,v24.3.0 是一次典型的 Current 线 minor 版本,风险等级较低,但对以下三类开发者尤其值得关注:
- 直接运行 TypeScript 的团队:type stripping 的实验警告被移除,配合 amaro 1.1.0 与 CJS/ESM 加载器重构,
.ts直接执行的体验更成熟; - 使用 node:test 的团队:新增对象属性 mock,并确认了 subtest 自动等待语义,内置测试能力进一步增强;
- 高频处理 file:// URL 路径的团队:新的
fileURLToPathBuffer返回 Buffer 路径,可减少转换开销。
npm 随版本升级至 11.4.2、sqlite 升至 3.50.1,日常使用面也会受到影响。由于 24.x 仍处于 Current 阶段,生产环境如需 LTS 保障,请结合官方发布日程评估;安装时务必使用 PGP 签名 SHASUMS 校验下载完整性。
【免费下载链接】nodejs.orgThe Node.js® Website项目地址: https://gitcode.com/GitHub_Trending/no/nodejs.org
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考