Node.js v22.18.0(Jod LTS)发布深度解读:Type Stripping 默认开启与核心模块新特性全览
【免费下载链接】nodejs.orgThe Node.js® Website项目地址: https://gitcode.com/GitHub_Trending/no/nodejs.org
2025 年 7 月 31 日,Node.js 官方发布了 22.x 版本线的 LTS 更新 v22.18.0(代号 Jod),由 Antoine du Hamel(@aduh95)负责发布。本文基于 nodejs.org 仓库中对应的发布博客原文,全面解读本次版本的 Notable Changes(重要变更)、模块级修复与改进,并结合该仓库的发布脚本与博客数据流水线,说明这类发布文章是如何在 nodejs.org 网站仓库中自动生成的。读完本文,你将掌握:Type Stripping 默认启用的使用方法与关闭方式、import.meta.main与--watch-kill-signal等新 API 的语义,以及如何校验官方二进制包的 SHASUMS 签名。
一、版本背景:一次以 SEMVER-MINOR 为主的 LTS 更新
v22.18.0 属于 Node.js 22.x(Jod)LTS 版本线,发布日期为 2025-07-31,发布格式为:
## 2025-07-31, Version 22.18.0 'Jod' (LTS), @aduh95本次更新包含 9 项SEMVER-MINOR(向后兼容的新功能)变更,涉及deps、esm、fs、permission、sqlite、url、watch、worker等多个模块,同时伴随大量修复与工具链升级。从仓库中的发布记录可以看到,这条版本的完整提交列表被整理在 v22.18.0.md 中,是了解该版本全貌的一手资料。
二、头条特性:Type Stripping 默认启用
本次发布最重要的变化是Type Stripping(类型剥离)在默认情况下开启:Node.js 无需任何额外配置即可直接执行 TypeScript 文件。
官方给出的最小验证示例:
$ echo 'const foo: string = "World"; console.log(`Hello ${foo}!`);' > file.ts $ node file.ts Hello World!也就是说,只需要把.ts文件交给node命令,类型注解会被在运行时剥离,代码照常执行。该功能由 Marco Ippolito 在 PR #56350 中贡献,并且从该版本的提交记录可以还原它的落地过程:
module: unflag --experimental-strip-types(取消该特性的实验性 flag);module: remove experimental warning from type stripping(移除类型剥离的实验性警告);deps: update amaro to 1.1.0/1.0.0/0.5.3/0.5.2/0.5.1/0.5.0(逐步升级内置的 amaro 转译器);module: improve typescript error message format、module: refactor commonjs typescript loader、module: fix typescript import.meta.main。
使用前提与限制
需要特别注意的是,该功能仍处于实验阶段(experimental),后续可能发生变更。具体支持语法与限制(例如不支持需要运行时语义的枚举、命名空间等语法)以官方 TypeScript 文档的「Type Stripping」章节(typescript.html#type-stripping)为准。如果希望关闭该行为,可以在命令行显式传入:
$ node --no-experimental-strip-types file.ts从提交module: unflag --experimental-strip-types可以看出,开启状态现在是默认值,--no-前缀的 flag 用于回退到旧行为。对团队而言,这意味着 CI 与本地开发环境只要升级到该版本,即可零成本运行纯类型注解的.ts脚本,但涉及复杂 TS 语法(如enum、namespace、运行时装饰器等)的代码仍建议使用官方tsc编译链路。
三、其他值得关注的 SEMVER-MINOR 变更
除 Type Stripping 外,本次版本还引入了 8 项新能力,逐项说明如下。
3.1 esm:import.meta.main判断模块是否为入口
由 Joe 贡献(PR #57804),在 ESM 模块中可以通过import.meta.main判断当前模块是否为主入口文件,常用于「被直接运行时执行、被导入时不执行」的双重用途脚本:
if (import.meta.main) { // 仅当直接运行本文件时执行 main(); }3.2 fs:fs-events 突发场景的 AsyncIterator 处理
由 Philipp Dunkel 贡献(PR #58490),修复了 fs-events 在高频突发事件下使用 AsyncIterator 遍历时的处理问题,使fs.watch等基于事件迭代的场景能更正确地在突发写入时保持数据一致性。
3.3 permission:权限模型增强
本次版本对 Node.js Permission Model(权限模型)做了两处增强(均由 Rafael Gonzaga 贡献):
- spawn 时传播权限模型 flag(PR #58853):子进程通过
child_process启动时,权限模型的限制 flag 会正确传播,避免子进程绕过父进程的权限约束; permission.has(addon)(PR #58951):为权限模型新增对 addon(原生插件)的检测能力,可以在src,permission层面查询某个 addon 是否被当前权限策略允许。
此外还有src,permission: enhance permission model debug(PR #58898)与src: pass resource on permission checks for spawn(PR #58758)等配套改动,完善了权限检查的调试输出与资源上下文传递。
3.4 sqlite:连接级readBigInts选项
由 Miguel Marcondes Filho 贡献(PR #58697),在数据库连接级别新增readBigInts选项。启用后,从 SQLite 读回的 INTEGER 大整数将以BigInt形式返回,避免超出 JavaScriptNumber安全整数范围时丢失精度。
3.5 url:fileURLToPathBufferAPI
由 James M Snell 贡献(PR #58700),新增fileURLToPathBufferAPI,可将file://形式的 URL 直接转换为Buffer形式的文件路径。相比返回字符串的fileURLToPath,它更适合需要零拷贝、直接处理二进制路径的场景。
3.6 watch:--watch-kill-signalflag
由 Dario Piotrowicz 贡献(PR #58719),--watch模式下新增--watch-kill-signal命令行 flag,允许用户自定义重启进程时发送的信号(默认通常为SIGTERM),例如:
$ node --watch --watch-kill-signal=SIGINT server.js配套提交doc: add all watch-mode related flags to node.1(PR #58719)把所有 watch 模式相关 flag 补进了node.1手册页,并且新增测试test: add tests to ensure that node.1 is kept in sync with cli.md(PR #58878),防止手册与 CLI 文档日后脱节。
3.7 worker:Worker支持异步可释放(Async Disposable)
由 James M Snell 贡献(PR #58385),Worker现在实现了 Async Disposable 协议,可以配合await using使用,作用域结束时自动优雅关闭工作线程:
await using worker = new Worker('./worker.js'); // worker 在此作用域结束后自动释放配套新增测试test: add test for async disposable worker thread(PR #58385)验证该行为。
四、模块级提交速览:修复、依赖与工具链
除上述新特性外,v22.18.0 还包含大量修复与依赖升级。下面按模块归纳(括号内为对应 PR 编号,提交原文可在 v22.18.0.md 中检索)。
依赖升级(deps)
- npm 升级至 10.9.3(PR #58847);
- sqlite 升级至 3.50.2(PR #58882)、3.50.1(PR #58630);
- simdjson 升级至 3.13.0(PR #58629);
- zlib 升级至 1.3.1-470d3a2(PR #58628);
- acorn 升级至 8.15.0(PR #58711);
- minimatch 升级至 10.0.3(PR #58712);
- googletest 更新至 35b75a2(PR #58710);
- amaro 系列升级(PR #56350),支撑 Type Stripping。
核心模块修复
- crypto:修复 OpenSSL 3.4 引入的 SHAKE128/256 破坏性变更(PR #58942);修复
OPENSSL_IS_BORINGSSL宏定义包含问题(PR #58845); - dns:修复解析过程中的内存泄漏(PR #58973);当 timeout 为负时统一设为 1000ms(PR #58441);
- http:修复 keep-alive 在请求体空行之后不超时的问题(PR #58178);
- http2:新增 diagnostics channel 事件
http2.server.stream.close(PR #58602); - os:修复
GetInterfaceAddresses内存泄漏(PR #58940); - repl:修复关闭后抛出
ERR_USE_AFTER_CLOSE(PR #58791);tab 补全不再使用已废弃的require.extensions(PR #58653);修复计算字符串属性的 tab 补全(PR #58709); - util:
util.inspect不再因 Error 的 stack 指向自身而崩溃(PR #58196); - v8:修复 heap utils destroy 中缺失的回调(PR #58846);
- module:
convertCJSFilenameToURL支持 schema-only 核心模块(PR #58612);允许 ESM loader 的 CJS 处理中require()循环依赖(PR #58598);更新混合模块语法错误的测试(PR #55874); - inspector:新增协议方法获取已发送/已接收数据(PR #58645);
DOMException支持序列化/反序列化(PR #58649)。
构建与工具链
- 非 64 位平台禁用
v8_enable_pointer_compression_shared_cage(PR #58867);支持自定义 inspector_protocol 路径(PR #58839);修复若干-Wunreachable-code告警(PR #58901);make distclean移除config.status(PR #58603);eslint 迁移至@stylistic/eslint-plugin(PR #58623);gyp-next 更新至 0.20.2(PR #58788);nodedownload 工具兼容 Python 3.14(PR #58752)。
文档、测试与元数据
- 文档侧修复了大量
globals.md、http2、stream.md等页面的格式与链接问题,并为 TypeScript 支持、--input-type补充历史条目(PR #56350); - 新增 collaborators:islandryu(PR #58714)、IlyasShabi(PR #58916),ovflowd 回归核心协作者(PR #58911);
- 测试侧新增 fs.cp、递归 readdir 等已知问题用例(PR #58883、#58893),并多处提升测试稳定性(deflake)。
五、发布文章在 nodejs.org 仓库中的生成机制
本文所依据的 v22.18.0.md 并非纯手工编写。从仓库源码结构看,nodejs.org 提供了「一键生成发布博客」的脚本流水线,理解它能帮你反推出发布文章每个部分的来源:
- 发布脚本入口:scripts/release-post/index.mjs 以
node index.mjs [version]方式运行;不传版本号时,会从 Node.js dist 的index.json自动抓取最新版本号(findLatestVersion)。 - 数据抓取:脚本通过
fetchChangelog从对应版本线的 CHANGELOG 中按<a id="vX.Y.Z"></a>锚点切出该版本的变更区段(正则rxSection);通过fetchAuthor从 changelog 头部## 日期, Version X.Y.Z (LTS), @author解析发布人(正则rxReleaseAuthor/rxPolicy);通过fetchShasums拉取SHASUMS256.txt.asc;通过verifyDownloads逐条 HEAD 探测各下载文件是否可用,不可用则标记*Coming soon*。 - 模板渲染:scripts/release-post/template.hbs 使用 Handlebars 将抓取到的 changelog、下载清单、SHASUMS 拼接成最终的 Markdown,frontmatter(date、category、title、layout、author)也在模板中生成,再经 Prettier 格式化后写入
pages/en/blog/release/vX.Y.Z.md。 - 下载清单规则:scripts/release-post/downloadsTable.mjs 定义了 16 类安装包模板(Windows x86/x64/arm64 的 MSI 与二进制、macOS pkg 与 darwin 二进制、Linux x64/ppc64le/s390x/armv7l/arm64、AIX、源码包等),并按语义化版本过滤:
< 16.0.0去掉 Apple Silicon 二进制、< 19.9.0去掉 Windows ARM 产物、>= 23.0.0去掉 32 位 Windows、>= 24.0.0去掉 ARMv7。v22.18.0 因此同时包含 Windows 32 位与 ARMv7 产物。
这类发布文章在站内还承担了「版本动态」的展示职责:博客元数据由 scripts/blog-data/generate.mjs 通过流式读取每个 Markdown 的 frontmatter(category: release)生成public/blog-data.json,并由 next.json.mjs 注入构建;util/blog.ts 中的mapBlogCategoryToPreviewType会把release类别映射为专门的预览类型,分页则按 next.constants.mjs 中的BLOG_POSTS_PER_PAGE = 6计算,types/blog.ts 中定义了BlogPreviewType = 'announcements' | 'release' | 'vulnerability'。因此发布文章会直接出现在官网 Blog 的 release 栏目与年度归档(year-2025、all)中。
六、下载产物与 SHASUMS 校验
v22.18.0 的官方构建产物与校验信息同样收录在发布文章中。各平台安装包清单(文件名格式)如下:
| 平台 | 安装包 / 二进制 |
|---|---|
| Windows 32-bit | node-v22.18.0-x86.msi/win-x86/node.exe |
| Windows 64-bit | node-v22.18.0-x64.msi/win-x64/node.exe |
| Windows ARM 64-bit | node-v22.18.0-arm64.msi/win-arm64/node.exe |
| macOS 64-bit | node-v22.18.0.pkg |
| macOS Apple Silicon | node-v22.18.0-darwin-arm64.tar.gz |
| macOS Intel | node-v22.18.0-darwin-x64.tar.gz |
| Linux 64-bit | node-v22.18.0-linux-x64.tar.xz |
| Linux PPC LE 64-bit | node-v22.18.0-linux-ppc64le.tar.xz |
| Linux s390x | node-v22.18.0-linux-s390x.tar.xz |
| AIX 64-bit | node-v22.18.0-aix-ppc64.tar.gz |
| ARMv7 32-bit | node-v22.18.0-linux-armv7l.tar.xz |
| ARMv8 64-bit | node-v22.18.0-linux-arm64.tar.xz |
| Source Code | node-v22.18.0.tar.gz |
全部产物存放于nodejs.org/dist/v22.18.0/目录,API 文档位于nodejs.org/docs/v22.18.0/api/。官方同时发布了 PGP 签名的SHASUMS256.txt.asc,其中包含每个文件的 SHA-256 校验和。发布文章末尾的### SHASUMS区块即该签名文件的内容,格式如下(节选):
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA256 7bb75af308fc9f63e568968e0ef0e1600bb105abe2d2af99217ac72e9a24ffd0 node-v22.18.0-aix-ppc64.tar.gz 1dd46ad5edd1085da2b1a5b7e3e2a03d0266476786a7849a1207045fecc73d39 node-v22.18.0-arm64.msi ... -----BEGIN PGP SIGNATURE----- ... -----END PGP SIGNATURE-----校验流程建议:先导入 Node.js 发布团队的 PGP 公钥,用gpg --verify SHASUMS256.txt.asc验证签名可信,再用sha256sum -c SHASUMS256.txt核对下载文件与官方校验和一致,确保产物未被篡改。完整的 40 余行校验和条目可在发布原文的### SHASUMS一节逐条核对。
七、升级建议与小结
v22.18.0 作为 Jod LTS 版本线的一次常规 LTS 更新,对日常开发者的直接收益集中在三点:
- 开箱即用执行
.ts:无需任何构建步骤即可运行纯类型注解脚本,适合脚本化、CLI 工具等场景;复杂 TS 语法仍需完整编译链路。 - 新增实用 API:
import.meta.main(入口判断)、fileURLToPathBuffer(路径 Buffer 化)、Worker异步释放、--watch-kill-signal、SQLitereadBigInts,分别解决了脚本入口判定、路径零拷贝、工作线程生命周期管理、watch 信号定制和大整数精度问题。 - 安全与稳定性修复:权限模型在 spawn 场景的传播增强、DNS/http/REPL 等模块的内存与超时修复,以及 npm 10.9.3、sqlite 3.50.2 等依赖升级。
所有变更的权威清单均可在 v22.18.0.md 中逐条查阅,而想要复刻这类发布文章的生成流程,可以参考 scripts/release-post 下的脚本与模板。如果你正在规划 CI 或本地环境的 Node 版本升级,建议先在非生产环境验证项目中的 TypeScript 写法是否全部落在 Type Stripping 的支持语法范围内,再决定是否启用这一默认行为。
【免费下载链接】nodejs.orgThe Node.js® Website项目地址: https://gitcode.com/GitHub_Trending/no/nodejs.org
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考