声明:本文是依据官方英文文档翻译而来。如有疑问,请参阅原始英文文档

原文:Node.js 20 is now available!

咱们很高兴地宣布发布 Node.js 20!亮点包含全新的 Node.js 权限模型、同步 import.meta.resolve、安稳的 test_runner,将 V8 JavaScript 引擎更新至 11.3 版别,Ada 更新至 2.0 等等!

该项目在许多领域持续取得发展,许多新功用和修正流入现有的LTS版别。因而,Node.js 20改变日志中概述的更改仅代表自上一个首要发布以来的一小部分功用和作业。本博客文章将为这些改变供给一些额定的布景信息。

您可以在 github.com/nodejs/rele… 上了解更多关于咱们的发布方针。

要下载 Node.js 20.0.0,请拜访:nodejs.org/en/download… 您可以在 nodejs.org/en/blog/rel… 找到发布帖子,其间包含此版别中包含的一切提交的完好列表。

请注意,Node.js 20 将于十月进入长期支撑(LTS)阶段,在此之前,未来六个月它都是“Current”版别。 咱们鼓舞您探究这个最新版别供给的新功用和优点,并评价它们对您的运用程序或许产生的影响。

显著改变

权限模型

Node.js 权限模型是一种实验性机制,用于在履行期间约束对特定资源的拜访。

在包含权限模型的第一个版别中,该功用具有以下才能:

  • 约束对文件体系的拜访(读和写)
    • 运用 --allow-fs-read--allow-fs-write
  • 约束对 child_process 的拜访
    • 运用 --allow-child-process
  • 约束对 worker_threads 的拜访
    • 运用 --allow-worker
  • 约束对本地插件的拜访(与 --no-addons 标志相同)

可用的权限由 –experimental-permission 标志记录。

运用 --experimental-permission 启动 Node.js 时,将约束拜访文件体系、生成进程和运用 node:worker_threads 的才能。

现在,运用 Node.js 的开发者可以经过引入 --allow-fs-read--allow-fs-write 标志来更好地操控文件体系的拜访。这些实验性功用答应更细粒度地操控哪些部分的文件体系可以被 Node.js 进程拜访。

要启用这些标志,开发人员可以运用 --experimental-permission 标志以及所需的权限。例如,运转以下指令可答应对整个文件体系进行读写操作:

$ node --experimental-permission --allow-fs-read=* --allow-fs-write=* index.js

开发者还可以经过将逗号分隔的值传递给标志来指定文件体系拜访的特定路径。例如,以下指令答应对 /tmp/ 文件夹进行写入拜访:

$ node --experimental-permission --allow-fs-write=/tmp/ --allow-fs-read=/home/index.js index.js

通配符形式也可以用于答应一次拜访多个文件或文件夹。例如,以下指令答应读取 /home/ 目录中以 test 开头的一切文件和文件夹:

$ node --experimental-permission --allow-fs-read=/home/test* index.js

当启用权限模型时,可以运用 process 对象的新属性 permission 在运转时查看是否已授予某个特定权限。

process.permission.has('fs.write'); // true
process.permission.has('fs.write', '/home/nodejs/protected-folder'); // true

需求注意的是,这些功用仍处于实验阶段,而且或许会在未来的 Node.js 版别中进行更改。

此外,可以在权限模型文档中找到更多信息。

权限模型由 Rafael Gonzaga 在 #44004 中奉献。

自界说 ESM loader hooks 挨近安稳

经过加载器 (--experimental-loader=./foo.mjs) 供给的自界说 ES 模块生命周期钩子现在在一个专用线程中运转,与主线程隔离。这为加载器供给了单独的效果域,并保证没有加载器和运用程序代码之间的交叉污染。

为了与浏览器行为共同,import.meta.resolve() 现在回来同步;请注意,用户加载器中的 resolve 钩子依然可以是异步的,假如 loader 作者期望,在运用程序代码中 import.meta.resolve 仍将回来同步。

这些更改是标记 ESM 加载程序安稳之前最后未完成的项目。一旦社区陈述了一段时间内没有重大错误,咱们方案将 loaders 标志、import.meta.resolveresolveload 钩子标记为安稳。这应该可以促进 ESM 的更广泛选用,因为重要利益相关者如工具厂商将具有一个安稳的 API 来构建分析和陈述库。

由 Anna Henningsen、Antoine du Hamel、Geoffrey Booth、Guy Bedford、Jacob Smith 和 Michal Zasso 在 #44710 中奉献。

V8 JavaScript 引擎更新至 11.3 版别

和以往一样,Node.js 中包含了 V8 引擎的新版别(更新到 11.3 版别,是 Chromium 113 的一部分),带来了改进的功能和新的言语特性,包含:

  • String.prototype.isWellFormed and toWellFormed
  • Methods that change Array and TypedArray by copy
  • Resizable ArrayBuffer and growable SharedArrayBuffer
  • RegExp v flag with set notation + properties of strings
  • WebAssembly Tail Call

V8 引擎更新由 Michal Zasso 在 #47251 中奉献。

安稳的 Test Runner

最近更新的 Node.js 版别 20 中,test_runner 模块有一个重要改变。该模块在最近一次更新后被标记为安稳版。安稳的测验运转器包含编写和运转测验所需的根本组件,包含:

  • describeit/test和hooks来构建测验文件
  • mocking(模拟)
  • watch mode(监视形式)
  • node --test用于并行运转多个测验文件

Test Runner 还包含一些没有安稳的部分,包含陈述生成和代码覆盖率。

以下是运用该测验运转器的简单示例:

import { test, mock } from 'node:test';
import assert from 'node:assert';
import fs from 'node:fs';
mock.method(fs, 'readFile', async () => "Hello World");
test('synchronous passing test', async (t) => {
    // This test passes because it does not throw an exception. 
    assert.strictEqual(await fs.readFile('a.txt'), "Hello World");
});

由 Colin Ihrig 在 #46983 中奉献

功能

随着新建立的 Node.js 功能团队,自上一个首要版别发布以来,功能得到了从头关注。Node.js 20 包含了许多对运转时根本部分的改进,包含 URLfetch()EventTarget

初始化 EventTarget 的本钱减少了一半,供给更快速地拜访一切运用它的子体系。此外,在 API (如URL.canParse() 和计时器)中利用V8 Fast API调用来进步功能。

Node.js 20 包含特定的更改,例如更新后的 Ada 2.0 版别,这是一个快速且符合标准的C++ URL解析器。

展望未来改进功能的新办法,咱们现在正在尽力经过重构来消除流、URLURLSearchParams 和 String Decoder 上品牌验证查看所带来的遵从标准本钱。这有助于支撑咱们在有意义之处遵从标准的总体目标。

假如您热衷于功能和Node.js,则咱们正在活跃寻觅奉献者参加咱们的功能团队。

EventTarget 初始化的本钱减少了一半,为一切运用它的子体系供给了更快的拜访速度。此外,Node.js 20 还利用了 V8 Fast API 调用来进步比如 URL.canParse() 和计时器等 API 的功能。

Node.js 20 还包含一些特定的改变,例如更新了 2.0 版别的 Ada,这是用 C++ 编写的一款快速且符合标准的 URL 解析器。

咱们等待经过新的办法来进步功能,现在正在尽力经过重构来降低遵从标准的本钱,以消除对流、URL、URLSearchParams 和 String Decoder 的品牌验证查看。这有助于支撑咱们在合理的情况下遵从标准的总体目标。

假如您对功能和 Node.js 充满热情,咱们正在活跃寻觅奉献者参加咱们的功能团队。

Preparing single executable apps now requires injecting a Blob

在过去的一年里,该项目一直在为单个可履行运用程序(SEA)供给支撑,最近开端支撑现已完成。随着功用仍处于实验阶段,团队持续完善这一办法。在 Node.js 20 中,构建单个可履行运用程序现在需求从 JSON 装备中注入由 Node.js 预备的 blob,而不是注入原始的 JS 文件。

例如:

sea-config.json

{
  "main": "hello.js",
  "output": "sea-prep.blob"
}

将 blob 写入 sea-prep.blob 文件。

$ node --experimental-sea-config sea-config.json

这个二进制 blob 现在可以被注入到二进制文件中。

这个改变是为了答应将多个共存的资源嵌入 SEA(单一可履行运用程序)中,然后敞开新的运用场景。

由 Joyee Cheung 在 #47125 中奉献。

Web Crypto API

该项目致力于与其他 JavaScript 环境的互操作性。例如,在 Node.js 20 中,Web Crypto API 函数的参数现在依照它们的 WebIDL 界说进行强制转化和验证,就像其他 Web Crypto API 完成一样。这进一步进步了与其他 Web Crypto API 完成之间的互操作性。

由 Filip Skokan 在 #46067 中奉献。

ARM64 Windows 的官方支撑

Node.js 具有广泛的渠道和架构支撑,人们似乎期望它能在任何地方运转。咱们很高兴地宣布,Node.js现在包含了适用于ARM64 Windows的二进制文件,使其可以在该渠道上进行本地履行。MSI、zip/7z 包和可履行文件可以从 Node.js 下载站点以及一切其他渠道一起取得。CI 体系已更新,而且现在一切更改都已彻底测验经过 ARM64 Windows,以防止回归并保证兼容性。

ARM64 Windows 在 #47233 中被 Stefan Stojanovic 升级为二级支撑。

Web Assembly System Interface (WASI) 的发展

该项目持续在 Node.js 中完成 WASI。一些值得注意的发展是,尽管它仍处于实验阶段,但不再需求指令行选项来启用 WASI。这应该使其更易于运用。WASI 开发的团队等待着发布 preview2 版别,还对未来进行了一些方案性改变。当 new WASI() 被调用时,需求添加一个 version 选项。在 20.x 版别中,version 是必需的,且没有默认值。这很重要,因为当支撑新版别时,运用程序不会默认运用或许已过时的版别。然而,这意味着任何依赖于默认版别的代码都需求更新以请求特定版别。

假如您有爱好在 Node.js 或 uvwasi 中运用 WASI,而且期望成为奉献者,请联系该团队。

呼吁举动!

请咱们测验新的 Node.js 20 版别!咱们非常乐意听取您的反应。运用 Node.js 20 测验您的运用程序和模块有助于保证您的项目与最新的 Node.js 改变和功用具有未来兼容性。值得注意的是,Node.js 14 将在 2023 年 4 月停止维护, 因而咱们建议您开端方案升级到Node.js 18(LTS)或即将成为LTS的 Node.js 20。请注意, Node.js16(LTS)将在 2023 年 9 月停止维护, 并提前从原定于2024年4月完毕支撑以合作OpenSSL1.1.1支撑完毕时间。 您可以在 nodejs.org/en/blog/ann… 上阅读更多关于该决定的详细信息。展望未来,Next-10 团队正在进行一项查询以搜集生态体系信息,请参加并协助塑造 Node.js 的未来,在这里提交您的反应定见。