
Node.js 18.0.0 发布全解析全局 fetch、内置测试运行器与 V8 10.1 的里程碑升级【免费下载链接】nodejs.orgThe Node.js® Website项目地址: https://gitcode.com/GitHub_Trending/no/nodejs.org本篇文章以 Node.js 官网仓库中 v18.0.0 发布博客 为蓝本系统梳理 Node.js 18 首个 Current 版本带来的全部重大变更SEMVER-MAJOR、实验性新能力与工具链升级并对照 nodejs.org 站点源码说明发布博客是如何被自动生成、渲染与呈现的。读完本文你将掌握 v18 的关键能力取舍、破坏性变更清单、新全局 API 的启用方式以及发布公告背后的生产链路。一、版本背景与发布定位Node.js 18.0.0 于 2022 年 4 月 19 日发布版本策略为Current非 LTS由 Bethany Nicolle Griggs 撰写发布公告。该版本随附 npm 8.6.0、V8 10.1 引擎与 ICU 71.1并一次性引入了三项对整个生态影响深远的实验性能力全局可用的fetchAPI基于 undici内置测试运行器模块node:testWeb Streams API 全局对象。从发布博客的 frontmatter 可以看到该文档使用category: release与layout: blog-post元数据见 v18.0.0.md这意味着它会自动归入官网博客的 release 分类并采用博客文章布局渲染。在 Blog 布局 中博客分类标签包括all、announcements、release、vulnerability、migrations、events而 blog.ts 通过mapBlogCategoryToPreviewType将release直接映射为对应的预览类型使 v18.0.0 这类发布文章得以在博客列表与分页中正常展示。二、Deprecations and Removals五项破坏性变更v18.0.0 一口气完成了多项运行时废弃runtime deprecation与移除全部标记为SEMVER-MAJOR模块变更内容影响fs运行时废弃fs.write、fs.writeFileSync中的字符串强制转换传非字符串/ Buffer 参数将触发废弃警告PR #42607dns移除dns.lookup与dnsPromises.lookup的 options 类型强制转换非法 options 不再被静默纠正PR #41431process运行时废弃multipleResolves不推荐的 Promise 多次 resolve 事件监听被标记废弃PR #41896stream移除 thenable 支持依赖 thenable 语义的 stream 代码需迁移PR #40773tlstls.parseCertString进入生命周期终结EOL该 API 被彻底移除需改用querystring解析PR #41479值得留意的是fs的废弃属于运行时废弃而非静态废弃意味着只有实际以错误类型调用时才会在运行时输出警告这与 releaseData.mjs 中按发布计划计算的 Current / LTS / EOL 状态逻辑相互独立——废弃是 API 层面的信号而版本状态如 v18 后来进入 LTS则由getNodeReleaseStatus依据latest.lts.isLts与 EOL 日期自动判定。三、fetch (experimental)Node 原生 HTTP 客户端的新纪元v18.0.0 首次将实验性的fetchAPI 默认挂在全局作用域其实现基于 undici一个由 Node.js 贡献者社区为 Node 编写的 HTTP/1.1 客户端。发布博客给出了最简用法const res await fetch(https://nodejs.org/api/documentation.json); if (res.ok) { const data await res.json(); console.log(data); }通过该次添加以下全局对象一并可用fetch、FormData、Headers、Request、Response。如需关闭此实验特性可使用命令行标志node --no-experimental-fetch app.mjs从仓库源码可以印证 undici 的地位在 downloadsTable.mjs 与 index.mjs 中发布博客生成脚本本身就大量使用全局fetch拉取 changelog、作者信息、SHASUMS 与下载文件清单request()函数基于fetch实现。也就是说nodejs.org 站点自身的发布自动化工具链正是在 Node 18 引入的全局 fetch 之上构建的这为fetchAPI 提供了一份来自官方站点的自举式实践证据。四、HTTP Timeouts默认超时值与 DoS 防护v18.0.0 将http.Server的两个关键超时参数改为更安全的默认值server.headersTimeout解析器等待完整 HTTP 头部的最长时间默认60000 毫秒60 秒server.requestTimeout接收客户端完整请求的超时毫秒数默认300000 毫秒5 分钟。一旦超时到期服务器会直接以408 状态码响应不将请求转发给 request 监听器随后关闭连接。官方特别强调在未部署反向代理reverse proxy的部署场景下两个超时都必须设置为非零值以抵御潜在的拒绝服务Denial-of-Service攻击。相关实现由 Paolo Insogna 在 PR #41263 中重构完成。同一发布周期内另一个与 HTTP 网络栈强相关的破坏性变更是TCP noDelay 默认开启PR #42163SEMVER-MAJOR它改变了 Nagle 算法的默认行为对小包、低延迟场景的响应速度有直接提升。五、Test Runner 模块实验性内置 TAP 测试能力node:test模块用于创建输出TAP 格式测试结果的 JavaScript 测试且仅在node:scheme 下可用import test from node:test; test(top level test, async t { await t.test(subtest 1, t { assert.strictEqual(1, 1); }); await t.test(subtest 2, t { assert.strictEqual(2, 2); }); });这段代码展示了父测试与两个子测试subtest的组织方式——t.test()返回的 Promise 需要被await以保证父子测试的执行顺序。该模块由 Colin Ihrig 在 PR #42325 中引入同期还有支持only测试的 SEMVER-MINOR 提交PR #42514。从仓库的提交列表看module,repl: support node:-only core modulesPR #42325与test: add initial test module同批落地说明node:test与node:前缀约束是配套设计目的就是明确核心模块与第三方包的命名空间边界。六、Toolchain and Compiler Upgrades构建基线的整体抬升v18.0.0 对官方预编译二进制的构建基线做了显著调整Linux预编译二进制改为在 Red Hat Enterprise LinuxRHEL8 上构建兼容基于glibc 2.28 或更高版本的发行版例如 Debian 10、RHEL 8、Ubuntu 20.04macOS预编译二进制要求macOS 10.15 或更高版本AIX最低支持架构从 Power 7 提升至Power 8。两个重要限制32 位 Windows 预编译二进制暂不提供原因是构建 V8 依赖时存在问题官方计划在后续 V8 更新中恢复不再支持已停止维护的操作系统对于供应商计划在 2025 年 4 月前结束支持的系统如 2023 年 1 月结束的 Windows 8.1、2023 年 10 月结束的 Windows Server 2012 R2Node.js 18 的支持也会提前终止。这些变化在发布博客的 Semver-Major Commits 中均有对应提交例如build: bump macOS deployment target to 10.15、build: make x86 Windows support temporarily experimental、build: downgrade Windows 8.1 and server 2012 R2 to experimental、doc: update minimum glibc requirements for Linux与doc: update AIX minimum supported arch。与此同时NODE_MODULE_VERSION被提升到 108意味着原生模块必须针对新 ABI 重新编译。七、V8 10.1引擎与语言能力的同步V8 引擎更新至10.1属于 Chromium 101。与 Node.js 17.9.0 内置版本相比新增特性包括Array.prototype.findLast与findLastIndex数组方法Intl.LocaleAPI 的改进Intl.supportedValuesOf函数类字段class fields与私有类方法private class methods的初始化性能提升现已与普通属性存储一样快。此外v8.serialize(value)返回的序列化数据格式发生变化旧版 Node.js 无法反序列化新格式但 API 保持向后兼容仍可反序列化旧格式。这一细节对依赖v8.serialize做跨版本数据持久化的项目是重要的升级前检查点。八、Web Streams API实验性浏览器标准流式原语进驻全局Node.js 18 在全局作用域暴露了 Web Streams API 的实验性实现以下 API 无需import即可直接使用ReadableStream、ReadableStreamDefaultReader、ReadableStreamBYOBReader、ReadableStreamBYOBRequest、ReadableByteStreamController、ReadableStreamDefaultController、TransformStream、TransformStreamDefaultController、WritableStream、WritableStreamDefaultWriter、WritableStreamDefaultController、ByteLengthQueuingStrategy、CountQueuingStrategy、TextEncoderStream、TextDecoderStream、CompressionStream、DecompressionStream。配套的 SEMVER-MAJOR 提交是stream: expose web streams globals, remove runtime experimental warningPR #42225即这些全局对象默认暴露且不再打印运行时实验性警告但整体仍属实验特性。同时Blob已从实验状态毕业为全局对象PR #41270BroadcastChannel也在 worker 线程中升级为受支持supportedAPIPR #41271。九、Other Notable Changes 与提交清单解读除上述大项外本版还有一批值得关注的变更buffer将Blob暴露为全局对象并使其从实验状态毕业PR #41270child_process改进参数校验非法参数将被更早、更明确地拒绝PR #41305http默认启用 TCP noDelayPR #42163netserver.address()的family字段改为返回整数PR #41431workerBroadcastChannel暴露为全局并升级为受支持 APIPR #41271process禁止部分对process.env的Object.defineProperty()用法PR #28006urlIPv6 主机名中出现 NULL 字符时直接抛错PR #42313v8v8.writeHeapSnapshot()错误码统一且fopen失败时抛错PR #42577、#41373assert,util深比较时同步比较RegExp.lastIndexPR #41020clusterkill简化为直接调用process.killPR #34312stream新增writableAbortedSEMVER-MINORPR #40802并统一writableErrored与readableErrored属性PR #40799。发布博客将这些变更完整列为 Semver-Major、Semver-Minor、Semver-Patch 三个提交清单每个条目都附有 commit hash 与 PR 编号便于精确追溯。补丁级别的代表性改动包括升级 Acorn 至 8.7.0、ICU 至 71.1、npm 至 8.6.0、undici 至 5.0.0、eslint 至 8.13.0以及大量文档与测试完善。十、下载产物与 SHASUMS 校验v18.0.0 发布公告末尾附带了完整下载清单与 PGP 签名的 SHASUMS 校验文件。结合 downloadsTable.mjs 中的产物模板可以确认 v18.0.0 的预编译产物覆盖以下平台32 位 Windows 因 V8 构建问题暂缺Windows 64 位 Installer / Binarynode-v18.0.0-x64.msi、win-x64/node.exemacOS Installer 与 Apple Silicon / Intel 二进制node-v18.0.0.pkg、node-v18.0.0-darwin-arm64.tar.gz、node-v18.0.0-darwin-x64.tar.gzLinux x64 / PPC LE / s390x 二进制node-v18.0.0-linux-x64.tar.xz、node-v18.0.0-linux-ppc64le.tar.xz、node-v18.0.0-linux-s390x.tar.xzAIX 64 位node-v18.0.0-aix-ppc64.tar.gzARMv7 32 位与 ARMv8 64 位node-v18.0.0-linux-armv7l.tar.xz、node-v18.0.0-linux-arm64.tar.xz源码包node-v18.0.0.tar.gz。发布文件中的 SHASUMS 段以 PGP 签名包裹-----BEGIN PGP SIGNED MESSAGE-----Hash: SHA256包含每个产物的 SHA-256 哈希。例如 Linux x64 二进制包node-v18.0.0-linux-x64.tar.xz的哈希为ffe94f0a3804e186b53f9480f4ef3a0c9ec450d7da45526438f6d37be9f4d22emacOS Apple Silicon 二进制包node-v18.0.0-darwin-arm64.tar.gz的哈希为01f2e194074e209340c7b7320bbb568829120c7747d469214ec76413d950bced注该哈希在原文中与 aix 条目为同一行前缀完整条目以发布文件为准。下载后可通过sha256sum file与公告中对应哈希比对并校验 PGP 签名来确保产物完整性。十一、发布博客在生产站点的生成与渲染链路发布博客并非纯手工撰写nodejs.org 仓库提供了完整的自动化生成脚本 scripts/release-post/index.mjs其工作流清晰可循指定版本通过node index.mjs [version]传入版本号缺省时从https://nodejs.org/dist/index.json自动获取最新版本拉取素材fetchDocs()并行执行五项任务——从 Node.js changelog 中解析对应版本段落fetchChangelog、从 GitHub API 获取作者姓名fetchAuthor、解析版本策略 Current / LTSfetchVersionPolicy、拉取 PGP 签名的 SHASUMSfetchShasums、逐个 HEAD 探测下载产物是否可用verifyDownloads不可用则标记*Coming soon*渲染模板使用 Handlebars 编译 template.hbs将 changelog 正文、下载文件列表与 SHASUMS 注入 frontmatterdate、category: release、title、layout: blog-post、author格式化与落盘经 Prettier 以 markdown parser 格式化后写入pages/en/blog/release/vversion.md若文件已存在且未加-f强制标志则拒绝覆盖。值得注意该脚本的request()与urlOrComingSoon()都建立在全局fetch之上——正是 v18 引入的能力支撑了官方站点发布工具的编写形成闭环。生成后的 MDX 文件在前端由 博客路由 读取basePage.getMarkdownContext()解析 frontmatter 与 Markdown 内容renderPage()依据context.frontmatter.layout此处为blog-post选择布局渲染该路由被标记为force-static并以revalidate 300周期性刷新缓存。文章中的Release /相关交互组件如 VersionDropdown则通过 mdx/components.mjs 注册由 releaseProvider 提供版本上下文——例如当用户选择 LTS 版本但当前路径是/download/current时会通过redirect跳转到对应语义路径。结语Node.js 18.0.0 是 Node 演进史上的关键一跃全局fetch让服务端不再依赖第三方 HTTP 客户端node:test开启了内置测试生态Web Streams 与 V8 10.1 则进一步拉近了 Node 与浏览器标准之间的距离。对于升级者而言本版本的 Semver-Major 清单fs 字符串强制转换废弃、stream thenable 移除、dns.lookup类型强制移除、tls.parseCertString移除等是需要优先排查的兼容性雷区而默认超时值、TCP noDelay 与构建基线的变化则直接影响生产部署规划。透过 nodejs.org 仓库的发布脚本与渲染链路你还能完整复现发布公告从 changelog 到官网页面的自动化过程为自有项目的版本公告体系提供参考范本。【免费下载链接】nodejs.orgThe Node.js® Website项目地址: https://gitcode.com/GitHub_Trending/no/nodejs.org创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考