多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

Node.js v22.14.0 “Jod“(LTS)发布全解读:TypeScript 执行增强、process.ref/unref 与 test_runner 快照新 API

Node.js v22.14.0 “Jod“(LTS)发布全解读:TypeScript 执行增强、process.ref/unref 与 test_runner 快照新 API Node.js v22.14.0 JodLTS发布全解读TypeScript 执行增强、process.ref/unref 与 test_runner 快照新 API【免费下载链接】nodejs.orgThe Node.js® Website项目地址: https://gitcode.com/GitHub_Trending/no/nodejs.org本篇基于 nodejs.org 仓库中的官方发布博文 v22.14.0 发布说明 展开系统解读 2025 年 2 月 11 日发布的 Node.js v22.14.0 JodLTS版本13 项 Notable Changes、近百条提交的模块级梳理、全平台安装包与 SHASUMS 校验方式并顺带揭示这份发布博文在 nodejs.org 仓库中是如何被自动化生成与展示的。读完本文你可以快速评估该版本是否值得升级以及如何安全下载、校验并应用这一 LTS 版本。一、版本概况Active LTS 窗口内的重要增量发布项目值版本号22.14.0代号Jod发布类型LTS长期支持发布日期2025-02-11发布负责人aduh95Antoine du Hamel变更性质全部为增量增强无破坏性变更标记v22 主线处于 Active LTS 阶段。本仓库的发布数据生成器 releaseData.mjs 给出了官网判断版本状态的统一逻辑若已过 EOL 日期则标记为EOL若该主版本最新版处于 LTS 阶段则标记为LTS否则为Current。22.14.0 作为 Jod 的 LTS 增量版本延续了「以功能增强与稳定性修复为主」的节奏——本版 13 项 Notable Changes 中有 12 项带有(SEMVER-MINOR)标记即向后兼容的小版本特性新增。二、Notable Changes13 项核心变更逐项解析2.1 TypeScript 支持再进一步lib / module / worker / deps本版本在 TypeScript 原生执行type stripping方向上连续落地了多项能力提交均由 Marco Ippolito 主导STDIN 求值支持 TypeScriptlib#56359此前node -e、STDIN 管道等求值入口无法直接处理带类型注解的代码本版起可以直接传入包含 TypeScript 语法的输入由内置的 amaroSWC 的 Rust 绑定剥离类型后执行例如echo const greeting: string Hello Jod; console.log(greeting); | node --input-typemodule-typescript -新增错误码ERR_UNSUPPORTED_TYPESCRIPT_SYNTAXmodule#56610当模块加载流程遇到无法剥离的 TypeScript 语法如 enum、namespace 等 amaro 暂不支持的类型级语法时抛出语义明确的专用错误码便于开发者快速定位哪些 TS 语法需要改写。Worker 支持 eval TS 输入worker#56394new Worker()的 eval 模式同样获得类型剥离能力与主线程的-e/STDIN 行为对齐。module统一 CommonJS 中 TypeScript 与.mjs的处理#55590重构了 CJS 加载器对 TS 文件的判断与解析路径使其与 ESM 侧行为保持一致。与之配套本版将 amaro 依赖从 0.2.1 一路升级到 0.3.0#56568、#56390并专门为module增加了对 SWC 错误的防御式处理#56646与 amaro 错误信息的重新抛出#56568避免底层错误被吞掉或误报。测试侧新增了 ts eval 快照用例#56358并在 Windows ARM64 上启用了相关测试#56349。注意具体命令行入口与标志如--input-type的取值、是否需要--experimental-strip-types随版本演进有差异请以当前安装版本的node --help输出与对应版本文档为准。2.2fs.glob的exclude选项支持 glob 模式从 v22.14.0 起node:fs的 glob 相关 APIfs.glob、fs/promises.glob的exclude选项不再局限于字面路径而是可以接受 glob 模式#56489。这意味着可以更自然地写出排除规则import { glob } from node:fs/promises; // 排除所有 .test.js 文件与 node_modules 目录 for await (const file of glob(**/*.js, { exclude: [**/*.test.js, **/node_modules/**], })) { console.log(file); }对于需要在大目录树中做文件遍历的工具脚本这一改动显著降低了编写排除规则的复杂度。2.3module.findPackageJSON工具node:module新增了同步工具findPackageJSON#55412用于从给定路径向上查找最近的package.json并返回其路径无需再手写逐级path.resolve(dir, package.json)的循环import { findPackageJSON } from node:module; const pkgPath findPackageJSON(/some/project/src/index.js); console.log(pkgPath); // /some/project/package.json该实现随后经历了简化重构#55543与异步解析错误修复#56382保证同步接口在内部解析出错时能正确失败而不产生悬挂的异步回调。2.4process.ref()与process.unref()process新增了ref()/unref()两个方法#56400用于显式控制进程是否因某个活动句柄而保持存活。典型场景是 Child Process 的 stdio 句柄child.unref()后父进程可以先行退出需要时再child.ref()恢复关联const { spawn } require(node:child_process); const child spawn(node, [-e, setInterval(() {}, 1000)]); child.unref(); // 父进程不再等待该子进程 // ... 某些条件下希望重新等待 child.ref();本版同时在 process 相关提交 中修正了方法符号键、并将其标记为实验性experimental#56517使用前应关注实验性 API 的语义变动风险。2.5node:sqlite的StatementSync支持 TypedArray 与 DataViewnode:sqlite的StatementSync在绑定参数时新增了对TypedArray与DataView的支持#56385可以直接将二进制缓冲区写入 SQLite 的 BLOB 列import { DatabaseSync } from node:sqlite; const db new DatabaseSync(:memory:); db.exec(CREATE TABLE blobs (id INTEGER PRIMARY KEY, data BLOB)); const stmt db.prepare(INSERT INTO blobs (data) VALUES (?)); stmt.run(new Uint8Array([1, 2, 3, 4])); // TypedArray 直接绑定这对于需要持久化图片、序列化数据等二进制内容的 SQLite 应用是一处实用性较强的补全。具体参数绑定语义以 node:sqlite 官方文档 为准。2.6 运行时与 Worker--disable-sigusr1与isInternalWorker--disable-sigusr1src#56441新增启动标志用于禁用 SIGUSR1 信号 I/O 线程。在部分容器化或特殊信号策略的 Linux 环境下SIGUSR1 信号线程可能带来干扰该标志为这类运维场景提供了显式开关。isInternalWorkersrc,worker#56469Worker 模块暴露内部 Worker 标识能力便于区分框架/运行时内部创建的 Worker与用户业务 Worker。本版文档还特别补充了该特性与 Permission Model权限模型 配合使用的说明#56706——在启用--permission的场景下内部 Worker 的权限判定与普通 Worker 存在差异。2.7test_runnerwaitFor / fileSnapshot / assert.register内置测试运行器node:test一口气新增了三项 API均出自 Colin IhrigTestContext.prototype.waitFor()#56595允许测试体等待任意 Promise 完成而不必将该 Promise 作为返回值交给框架适合测试过程中启动的后台任务场景import test from node:test; test(等待后台异步任务, async (t) { const task startBackgroundJob(); await t.waitFor(task); // 任务完成后继续断言 });t.assert.fileSnapshot()#56459对文件内容做快照断言首次运行生成快照后续运行对比文件内容是否与快照一致配合本版将快照测试整体标记为稳定#56425使用import test from node:test; test(生成物快照, (t) { writeFileSync(out.json, JSON.stringify(generate(), null, 2)); t.assert.fileSnapshot(out.json); // 与 .snap 快照对比 });assert.register()#56434向t.assert注册自定义断言函数让业务断言可以被复用并纳入统一的断言体系。另外spec报告器修复了失败断言重复打印的问题#56662并新增了仅输出错误的 reporter 测试#56438。2.8 信任链刷新NSS 3.107 根证书更新crypto模块将内置的 TLS 根证书集更新至 NSS 3.107#56566。这意味着使用 Node.js 内置证书库发起 HTTPS 请求时CA 信任列表与 Mozilla NSS 保持同步新增/吊销的根证书随之生效。对于依赖内置信任库的客户端应用这是一次常规但重要的安全同步。三、Commits 提交亮点按模块梳理除去 Notable Changes本版还有近百条提交按模块归类如下。3.1 assert 与 utilassert的myers_diff函数性能优化#56303partialDeepStrictEqual支持 URL 与File原型对象#56231部分比较失败时展示 diff#56211并能正确抛出0与-0的比较差异#56237。util.inspect修复了三类崩溃Error 的 stack 中包含 Symbol#56573、Error 的name是正则对象#56574、函数名为 Symbol#56572。util的 CallSite 暴露scriptId#56551并将CallSite.column重命名为columnNumber#56584。3.2 crypto修复checkPrime在超大缓冲区下的崩溃#56559generatePrime/checkPrime改为可中断interruptible操作#56460长耗时素数运算不再阻塞事件循环补齐多处的返回值检查#56615、#56527。3.3 依赖与构建corepack 升级至 0.31.0#56795ngtcp2 升级至 1.10.0#56334simdutf 多次升级#56567、#56388、#56332googletest 更新#56387、#56370inspector_protocol移入 deps 目录#56649。构建侧macOS 上为 V8 启用-fvisibilityhidden#56275修复 GCC 15 构建#56740与 loong64 构建#56466。3.4 inspector / diagnostics_channel / http2inspector 增加 undici HTTP 请求追踪支持#56488并修复loadingFinished在响应体被消费前就上报的问题#56372调试网络请求的时序更准确。diagnostics_channel开始捕获 console 消息#56292订阅者可观测应用内的 console 输出。http2在连接主机为 IP 地址时不再发送 server name#56530避免 SNI 语义错误。3.5 sqlite 其他改进启用 SQL 数学函数#56447冲突解决处理器现在能拿到冲突类型#56352构建期禁用 memstatus API#56541编译型测试与非编译型测试对齐#56446。3.6 stream / tls / url / watch / workerstream修复ReadableStreamBYOBReader.readIntoRequests的拼写错误#56560校验WritableStream中未定义的sizeAlgorithm#56067。tls修复cryptoErrorListToException()的栈转换问题#56554。url使用解析后的路径将 UNC 路径转换为 URL#56302。watch--env-file-if-exists场景下支持环境文件变更后重载#56643。worker重构 stdio 以提升性能#56630并在退出时刷新 stdout/stderr#56428避免日志丢失。libFORCE_COLOR在非 TTY 环境也强制输出颜色#55404优化内置栈帧的prepareStackTrace并抑制 source map 查找异常#56299允许跳过node_modules中的 source map 查找#56639。punycode弃用警告限流避免在大量使用该模块的应用中出现刷屏#56632。3.7 权限模型与文档权限模型Permission Model相关--permission取代实验性前缀--experimental-permission的测试迁移#56685、重复路径授予的去重#56591、fork 继承权限标志的澄清#56523以及新增使用 npx 配合权限模型的文档章节#56539。文档工作还包括Skip to content无障碍按钮#56750、可折叠列表的无障碍改进#56749等若干体验类更新。四、下载与校验从发布博文到安装包发布博文的末尾会固定列出该版本全部发行物由生成脚本的downloadsTable模块产出见 downloadsTable.mjsv22.14.0 的安装包清单如下平台架构安装包 / 二进制Windowsx86 / x64 / ARM64.msi安装器与node.exe二进制macOSIntel / Apple Silicon.pkg安装器与darwin-x64/darwin-arm64tar 包Linuxx64 / arm64 / armv7l / ppc64le / s390x.tar.xz与.tar.gzAIXppc64.tar.gz其他—源码包node-v22.14.0.tar.gz、-headers头文件包、-win-*.7z/zip压缩包以上文件统一发布在官方发行目录nodejs.org/dist/v22.14.0/下版本对应 API 文档位于nodejs.org/docs/v22.14.0/api/。如需完整列表可直接查看发布博文原文的下载段落v22.14.0.md。4.1 SHASUMS 与 PGP 校验流程博文末尾附带了SHASUMS256.txt.asc的完整内容一段PGP 签名消息内含每个发行物文件名的 SHA-256 哈希。以几个条目为例ddec69aded8f826efbef8b4af09baa451f5ed8b057e84d836accf33de04d2d7a node-v22.14.0-aix-ppc64.tar.gz e9404633bc02a5162c5c573b1e2490f5fb44648345d64a958b17e325729a5e42 node-v22.14.0-darwin-arm64.tar.gz 9d942932535988091034dc94cc5f42b6dc8784d6366df3a36c4c9ccb3996f0c2 node-v22.14.0-linux-x64.tar.gz推荐的校验流程为先验证SHASUMS256.txt.asc的 PGP 签名确认哈希清单本身未被篡改再用shasum -a 256 -c对比本地下载文件的哈希。Node.js 官网下载页current.mdx也提供了指向如何校验已签名 SHASUMS的指引入口并将其作为下载流程的安全建议步骤。五、在 nodejs.org 仓库中发布博文如何生成与展示这份发布说明并非纯手工撰写其生成链路在本仓库中清晰可见。5.1 生成脚本与模板apps/site/scripts/release-post/index.mjs 是发布博文的自动化生成器通过fetchChangelog从上游 changelog 抓取对应版本章节、fetchAuthor解析发布负责人、fetchVersionPolicy提取 LTS/Stable 状态、fetchShasums拉取 PGP 签名的哈希清单并用verifyDownloads逐个 HEAD 探测安装包是否已就绪。运行方式为node index.mjs [version]若省略版本号脚本会自动从发行索引中选取最新版本。生成结果经由 template.hbs 模板渲染frontmatter changelog 下载链接 SHASUMS 块再通过 Prettier 格式化后写入pages/en/blog/release/v{version}.md——这正是本文所依据的 v22.14.0.md 的来源。5.2 官网侧的消费与展示发布博文发布后会被 blog-data 生成器 汇总进博客数据供 博客归档页 使用。下载页 current.mdx 通过Release.Provider、Release.VersionDropdown、Release.PrebuiltDownloadButtons等组件动态渲染当前版本的安装方式并提供ChangelogLink/BlogPostLink直达本博文。各主版本的 LTS/Current/EOL 状态则由 releaseData.mjs 统一计算对应测试见 releaseData.test.mjs。六、升级评估与注意事项综合本版变更给出以下升级评估建议风险很低13 项 Notable Changes 均为SEMVER-MINOR增量特性根证书更新为常规安全同步发布负责人未标注任何破坏性变更v22 用户可放心升级。TypeScript 用户值得关注STDIN / eval / Worker 的 TS 支持与ERR_UNSUPPORTED_TYPESCRIPT_SYNTAX错误码让免编译跑 TS的体验更完整但 amaro 仍只支持类型剥离遇到 enum、namespace 等语法会报ERR_UNSUPPORTED_TYPESCRIPT_SYNTAX需要改写为可剥离语法。测试基建增强t.assert.fileSnapshot()、waitFor()、assert.register()三项新 API 加上快照测试转正适合在 CI 中逐步采用。实验性 API 需谨慎process.ref()/process.unref()已明确标记为 experimental生产环境使用前请评估其后续可能的变化。安全与运维建议升级后复核依赖内置根证书的 HTTPS 客户端行为特殊信号环境可评估--disable-sigusr1。安装或升级时优先从官方发行目录获取对应平台安装包并通过 PGP 签名与 SHA-256 双重校验确保完整性。【免费下载链接】nodejs.orgThe Node.js® Website项目地址: https://gitcode.com/GitHub_Trending/no/nodejs.org创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表