Node.js 18 现已发布

原文地址: https://nodejs.org/en/blog/announcements/v18-release-announce/ (opens new window)

# 前言

我们很高兴地宣布 Node.js 18 今天发布了!

亮点包括将 V8 JavaScript 引擎更新到 10.1 以及默认启用全局 fetch 以及一个核心的测试运行器模块。

首先,Node.js 18 将取代 Node.js 17 作为我们的 current 发布线。 根据发布时间表,Node.js 18 将是未来 6 个月的 current 版本,然后在 2022 年 10 月升级为长期支持 (LTS)。 一旦升级为长期支持,该版本将被指定为代号 Hydrogen (氢)。Node.js 18 将支持到 2025 年 4 月 (opens new window)

您可以在 https://github.com/nodejs/release (opens new window) 阅读有关我们发布政策的更多信息。

要下载 Node.js 18.0.0,请访问:https://nodejs.org/en/download/current/ (opens new window)。 您可以在 https://nodejs.org/en/blog/release/v18.0.0 (opens new window) 找到发布记录,其中包含此版本中包含的提交的完整列表。

# 新的浏览器兼容的全局 API

# Fetch (实验性的)

在 Node.js 18 中,默认情况下提供了一个实验性的全局 fetch API。

该实现来自 undici (opens new window) ,并受到最初基于 undici-fetch (opens new window)node-fetch (opens new window) 的启发。 该实现力求尽可能接近规范,但某些方面需要浏览器环境,因此被省略。

此 API 将保持实验性直到添加更多测试覆盖率并且贡献者已经验证 API 实现了尽可能多的规范。 如果您希望参与其中,请访问 nodejs/undici (opens new window) 仓库并查找带有 fetch 标记的问题。

此 API 的示例用法:

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.

您可以使用 --no-experimental-fetch 命令行标志来禁用该 API。

# Web Streams API(实验性的)

Node.js 现在在全局范围内公开了实验性的 Web Streams API (opens new window)

这意味着以下 API 现在在全局范围内可用了:

ReadableStream, ReadableStreamDefaultReader, ReadableStreamBYOBReader, ReadableStreamBYOBRequest, ReadableByteStreamController, ReadableStreamDefaultController, TransformStream, TransformStreamDefaultController , WritableStream, WritableStreamDefaultWriter, WritableStreamDefaultController, ByteLengthQueuingStrategy, CountQueuingStrategy, TextEncoderStream, TextDecoderStream, CompressionStream, DecompressionStream.

# 其他全局 API

此外,以下 API 现在也在全局范围内公开了:

  • Blob - https://nodejs.org/api/buffer.html#class-blob
  • BroadcastChannel - https://nodejs.org/api/worker_threads.html#class-broadcastchannel-extends-eventtarget

这两个 API 已由实验性 API 转为正式 API 了。

# 核心测试运行器模块(实验性的)

node:test 模块有助于创建以 TAP 格式 (opens new window) 报告结果的 JavaScript 测试用例。

以下是具有两个子测试的示例:

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);
    });
});

请注意,测试运行器模块只能使用 node: 前缀。 node: 前缀表示加载核心模块。省略前缀直接导入 test 会尝试加载用户区的模块。

您可以在 https://nodejs.org/dist/latest-v18.x/docs/api/test.html 阅读更多相关内容。

# 工具链和编译器升级

Node.js 为几个不同的平台提供了预构建的二进制文件。对于每个主要版本,都会在适当的情况下评估和提升最低工具链版本。

  • Linux 的预构建二进制文件现在基于 Red Hat Enterprise Linux (RHEL) 8 构建,并且与基于 glibc 2.28 或更高版本的 Linux 发行版兼容,例如 Debian 10、RHEL 8Ubuntu 20.04
  • macOS 的预构建二进制文件现在需要 macOS 10.15 或更高版本。
  • 对于 AIX,支持的最低架构已从 Power 7 提升到 Power 8

32 位 Windows 的预构建二进制文件暂时无法发布, 因为在 Node.js 中构建 V8 依赖项依然存在一些问题。 我们希望通过未来的 V8 更新恢复 Node.js 18 的 32 位 Windows 二进制文件。

Node.js 不支持在其供应商不再支持的操作系统上运行。 对于其供应商计划在 2025 年 4 月之前终止支持的操作系统,例如 Windows 8.1(2023 年 1 月)和 Windows Server 2012 R2(2023 年 10 月),Node.js 18 的支持将在更早的日期结束。

有关支持的工具链和编译器的完整详细信息记录在 Node.js BUILDING.md (opens new window) 文件中。

# 构建时用户空间快照(实验性的)

从 Node.js 18.0.0 开始,用户可以在配置脚本中使用 --node-snapshot-main 标志构建带有自定义 V8 启动快照的 Node.js 二进制文件。例如:

$ cd /path/to/node/source

# 指定该快照版的入口, 例如, 将一个用于渲染 Markdown 的 UMD 模块 marked 初始化并挂载到 globalThis 对象上.

$ ./configure --node-snapshot-main=marked.js

# 构建自定义的 Node.js 二进制文件
$ make node

生成的二进制文件可以反序列化由快照入口点在构建时初始化的堆状态,因此生成的二进制文件中的应用程序可以更快地初始化:

// 在 render.js 文件中, 您可以操作这个快照版 Node.js 的 globalThis.marked 方法, 
// 从而免去解析与执行模块的过程, 减少启动时间.
const html = globalThis.marked(process.argv[1]);
console.log(html);

生成的自定义二进制文件可以这样使用:

$ out/Release/node render.js test.md

作为后续,我们正在为用户态快照开发 JS API (opens new window),以便无需额外的运行时入口脚本即可执行二进制文件, 从而有效地将其转换为包含用户应用程序的单文件可执行文件。 我们还致力于使该功能成为运行时标志 (opens new window),以便无需编译器即可生成和加载快照。

# V8 引擎更新到 10.1

V8 引擎更新到 10.1 版本,它是 Chromium 101 的一部分。与 Node.js 17.9.0 中包含的版本相比,包括以下新功能:

# 其他

虽然在 Node.js 18 中并不新鲜,但在过去的几个月里,该项目继续开发其 ECMAScript 模块实现。 值得注意的里程碑包括添加对 JSON 导入断言 (opens new window) 的实验性支持、 取消标记 JSON 模块(实验性)以及对 HTTPS 和 HTTP 导入的实验性支持。 Node.js 加载器团队 (opens new window)还在继续开发 Node.js 中的 ECMAScript 模块加载器的实现。

该项目还在继续其 Next 10 (opens new window) 的努力。 这项工作的目标是反思导致 Node.js 前 10 年成功的原因,并为接下来的 10 年确定成功的方向。 已经举行了几次会议,讨论商定的技术优先事项 (opens new window)的下一步。 关于现代 HTTP、WebAssembly 和类型已经有很多讨论。下一场关于 ECMAScript 模块和可观察性的会议计划成为即将在 6 月举行的 OpenJS 世界大会 (opens new window)上的合作者峰会的一部分。

# 呼吁采取行动

试用新的 Node.js 18 版本!

我们总是很高兴听到您的反馈。使用 Node.js 18 测试您的应用程序和模块有助于确保您的项目将来与最新的 Node.js 更改和功能兼容。

另外值得注意的是,Node.js 12 将于 2022 年 4 月结束生命周期,因此我们建议您开始计划升级到 Node.js 14 (LTS) 或 Node.js 16 (LTS)。

有关 Node.js 发布的时间表,请查看 Node.js 发布时间表 (opens new window)

# 鸣谢

我们要感谢所有 Node.js 的合作者和贡献者,因为这个版本是他们所有持续努力的总和。