Node.js v20 中的新功能(测试运行器、权限模型、SEA、V8 JS 引擎 11.3)
已发表: 2023-04-28Node.js v20 现已可用! 2023年4月18日公开,现在大家可以使用了。 在此版本中,Node.js 应该更安全并且性能更好。
重要的是要知道——由于这是一个偶数版本,它计划在 2023 年 10 月成为长期支持 (LTS) 版本,并将支持到 2026 年 4 月。但是,Node.js 团队正在积极寻求社区反馈以在将其提升为 LTS 之前识别并修复任何问题。
Node.js 的这个新版本带来了开发人员肯定会喜欢的令人兴奋的更新和功能,例如实验性权限模型、同步import.meta.resolve
、稳定的测试运行器、将 V8 JavaScript 引擎更新到版本 11.3,带来性能改进和错误修复,以及更多。
在本文中,您将探索 Node.js v20 中引入的变化,深入了解其新特性和功能。
开始使用 Node.js v20
安装 Node.js v20 与其他版本的 Node.js 非常相似。 您需要做的就是:
- 从官方 Node.js 网站下载安装程序包。
- 下载安装程序后,运行它并按照说明完成安装过程。 这个过程非常简单,您只需同意许可协议并单击“下一步”按钮即可。
- 安装过程完成后重新启动您的系统/机器以确保所有更改生效。
- 通过运行以下命令验证您的 Node.js 安装:
node -v
如果您看到版本号 (v20.0.0),则表示 Node.js 已正确安装,您可以开始使用 Node.js v20。
Node.js v20 有什么新功能?
让我们探索此 Node.js 版本引入的 5 个主要更新。 这些功能包括:
实验权限模型
Node.js v20 中实验性权限模型的引入是一个重要的补充,它使开发人员能够在执行期间更好地控制对特定资源的访问。
当安全和资源使用至关重要时(例如在生产环境中),此新功能非常有用。
权限模型具有多种功能,包括限制对文件系统、child_process、worker_threads 和本机插件的访问。
开发人员可以使用--allow-fs-read
、 --allow-fs-write
和--allow-child-process
标志来指定可访问的资源。 要激活这些标志,开发人员需要结合使用--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
权限模型的一项显着优势是能够对文件系统的访问进行更精细的控制。 例如,开发人员可以指定路径和通配符模式以允许访问特定文件夹或文件。
$ node --experimental-permission --allow-fs-read=/home/user/* index.js
上面的命令授予对/home/user/目录中所有文件夹的读取权限。
进程对象的 permission 属性也可用于检查是否在运行时授予了特定权限。 例如,如果您想检查您的 Node.js 进程是否具有对特定文件夹/home/user/documents 的读取权限,您可以使用以下代码:
if (process.permission.has('fs.read', '/home/user/documents')) { console.log('Read access granted to /home/user/documents'); } else { console.log('Read access not granted to /home/user/documents'); }
通过使用权限模型,您可以更细粒度地控制 Node.js 进程的文件系统访问,这可以带来更好的安全性和更有效的资源利用。
请务必注意,权限模型仍处于实验阶段,可能会在 Node.js 的未来版本中发生变化。 建议及时了解权限模型文档,并在使用这些实验性功能时谨慎行事。
稳定的测试运行器
Node.js v20 包含一个稳定版本的 test_runner 模块,使开发人员能够快速轻松地构建和运行 JavaScript 测试套件,而无需安装额外的依赖项。
稳定的测试运行器现在包括几个构建块,例如describe
、 it
/ test
和 hooks ,用于编写和构建测试文件,以及模拟、观察模式和使用node --test
命令。
以下是如何使用测试运行器的示例:
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"); });
测试运行器通过--test-reporter
标志提供可配置和自定义的测试报告程序,通过--experimental-test-coverage
标志和模拟功能提供实验测试覆盖率。
虽然不打算取代 Jest 或 Mocha 等功能齐全的测试框架,但稳定的测试运行器提供了一种简单快速的方法来创建测试套件。 自从在 Node.js v19 中引入以来,它得到了显着增强,并且由于最终用户的测试和反馈,它现在在 Node.js v20 中被标记为稳定。
可以在这个合并的拉取请求中找到更多信息。
V8 JavaScript 引擎更新到 11.3
为 Node.js 提供支持的 V8 JavaScript 引擎已在 Node.js v20 中更新至版本 11.3。 这带来了改进的性能并引入了新的语言功能。 此更新的一些新功能包括:
-
String.prototype.isWellFormed
和toWellFormed
:这些方法对于确保正确的字符串格式特别有用。 这有助于确保用户字符串输入采用正确的 UTF-16 格式,减少表情符号时代的错误。 - 通过副本更改 Array 和 TypedArray 的方法:这对于在不影响原始数据的情况下创建数组的修改副本很有用,这在需要保留原始数据以进行比较或其他目的的情况下尤为重要。
- 可调整大小的
ArrayBuffer
和可增长的SharedArrayBuffer
:提供更大的灵活性,允许更有效的内存分配。 - RegExp v flag with set notation and properties of strings:添加正则表达式的功能。
- WebAssembly 尾调用:提供了一种优化某些类型函数调用的方法。
这些更新展示了 Node.js 开发社区对提高性能和功能的持续承诺。
同步 import.meta.resolve()
在 Node.js v20 中,引入了import.meta.resolve()
,这使得编写对位置不敏感的脚本变得更加容易。 此函数同步返回,类似于浏览器行为,允许更高效的执行。
用户加载器解析钩子仍然可以定义为异步函数,但是即使加载了异步解析钩子, import.meta.resolve()
仍然会为应用程序代码同步返回。
import.meta.resolve()
的同步行为允许更高效的代码执行,尤其是在处理大量数据时。 作为作者,您可以根据自己的喜好将解析挂钩定义为异步或同步函数。 无论是否加载了异步解析挂钩,应用程序代码仍将同步执行。
实验性单一可执行应用程序 (SEA)
实验性单一可执行应用程序 (SEA) 是 Node.js v20 中引入的一项新功能,允许将您的应用程序与 Node.js 二进制文件捆绑在一起,使最终用户能够将其作为单个可执行文件分发和运行。
这是社区长期以来的要求,该团队在过去一年中一直在完善该方法。
在 Node.js v20 中,构建单个可执行应用程序需要从 JSON 配置中注入由 Node.js 准备的 blob,而不是注入原始 JS 文件。
blob 是一个包含二进制数据的文件,在本例中,它由 Node.js 准备,并被注入到二进制文件中。 进行此更改是为了能够将多个共存资源嵌入到 SEA 中,从而开辟了新的用例。
这是sea-config.json文件的示例:
{ "main": "myscript.js", "output": "sea-prep.blob" }
当使用命令node --experimental-sea-config sea-config.json
执行时,blob 被写入sea-prep.blob文件,然后可以将其注入二进制文件。
SEA 功能允许开发人员分发 Node.js 应用程序,而无需用户安装 Node.js。 该功能由 Darshan Sen 创建,他在 OpenJS World 的 JavaScriptLandia 奖中获得了新来者杰出贡献奖。
作为 OpenJS 基金会成员的 Microsoft 正在研究此功能,以此作为减少向量攻击和增强 Node.js 架构以获得更好体验的方法。 虽然 SEA 功能仍处于实验阶段,但它代表了 Node.js 社区令人兴奋的新发展。
表现
Node.js v20 对其运行时进行了重大改进,新成立的 Node.js 性能团队重新关注性能。 这些改进包括对运行时核心部分的优化,例如 URL、 fetch()
和EventTarget
。
其中一项显着的改进是初始化EventTarget
的成本降低了一半,从而可以更快地访问使用它的所有子系统。 此外,V8 快速 API 调用已被用于增强URL.canParse()
和计时器等 API 的性能。
另一个具体的变化是包含了 Ada 的更新版本 2.0,这是一个用 C++ 编写的快速且符合规范的 URL 解析器。
概括
在本文中,您了解了 Node.js v20 带来的一些主要特性(实验性和稳定性)和改进,例如对 V8 JavaScript 引擎、性能、测试运行器和实验性权限模型的引入以及单执行应用程序的改进.
重要的是要知道 Node.js v14 将于 2023 年 4 月结束生命周期,因此建议开始计划升级到 Node.js v18 (LTS) 或 vNode.js 20(即将成为 LTS)。
您想试试最新版本的 Node.js 吗? 您可以通过在 Kinsta 上部署您的 Node.js 应用程序来做到这一点,并从我们这里获得您的第一笔 20 美元。 我们已经支持 Node.js v20,这意味着您可以从今天开始测试它的新特性和功能。
现在轮到你了! 您觉得 Node.js v20 中哪些功能或改进最有趣? 有没有我们可能忽略的重要内容? 让我们在评论中知道。