Node.js v20新特征(测试运行器、权限模型、SEA和V8 JS引擎升级至11.3)

Node.js v20新特征(测试运行器、权限模型、SEA和V8 JS引擎升级至11.3)

Node.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中引入的变化,深入了解其新特性和功能。

  1. 开始使用Node.js v20
  2. Node.js v20有哪些新特性?

开始使用Node.js v20

安装Node.js v20与其他版本的Node.js非常相似。你所需要做的就是:

  1. 从Node.js官方网站下载安装程序包。
  2. 一旦你下载了安装程序,运行它并按照说明完成安装过程。这个过程非常简单,你只需要同意许可协议并点击 “Next” 按钮。
  3. 安装过程完成后,重新启动你的系统/机器,以确保所有的变化生效。
  4. 通过运行以下命令验证你的Node.js安装:
node -v

Node.js v20的安装

Node.js v20的安装

如果你看到版本号(v20.0.0),这意味着Node.js已经正确安装,你可以开始使用Node.js v20。

Node.js v20有什么新特性?

让我们来探讨一下这个Node.js版本引入的5个主要更新。这些功能包括:

  1. 实验性许可模型
  2. 稳定的测试运行器
  3. V8 JavaScript引擎更新至11.3
  4. 同步的import.meta.resolve()
  5. 实验性的单一可执行应用程序(SEA)

实验性许可模型

在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/目录内所有文件夹的读取权限。

进程对象的权限属性也可以用来检查在运行时是否被授予了特定的权限。例如,如果你想检查你的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测试套件,而无需安装额外的依赖。

稳定版测试运行器现在包括几个构建模块,如 describeit/test 和hooks,用于编写和构建测试文件,还有mocking、watch模式,以及使用 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 标志提供实验性的测试覆盖率和嘲弄功能。

虽然不打算取代全功能的测试框架,如JestMocha,但稳定的测试运行器提供了一个简单而快速的方法来创建测试套件。自从在Node.js v19中引入以来,它已经得到了显著的增强,并且由于最终用户的测试和反馈,它现在已经在Node.js v20中被标记为稳定。

更多信息可以在这个合并的拉取请求中找到。

V8 JavaScript引擎更新至11.3

为Node.js提供动力的V8 JavaScript引擎在Node.js v20中已经更新到了11.3版本。这带来了更好的性能,并引入了新的语言功能。这次更新的一些新功能包括:

  •  String.prototype.isWellFormedtoWellFormed : 这些方法对于确保正确的字符串格式特别有用。这有助于确保用户的字符串输入是正确的UTF-16格式,减少在表情符号时代的错误。
  • 通过拷贝改变Array和TypedArray的方法: 这对于创建数组的修改副本而不影响原始数据是非常有用的,这在你需要保留原始数据用于比较或其他目的的情况下尤为重要。
  • 可调整的 ArrayBuffer 和可增长的 SharedArrayBuffer :提供更大的灵活性,允许更有效的内存分配。
  • 带有集合符号和字符串属性的正则表达式v标志:为正则表达式添加功能。
  • 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中,构建单个可执行应用需要注入Node.js从JSON配置中准备的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基金会的成员,微软正在调查这项功能,作为减少矢量攻击和赋予Node.js架构更好体验的一种方式。虽然SEA功能仍然是实验性的,但它代表了Node.js社区的一个令人兴奋的新发展。

性能

Node.js v20对其运行时进行了重大改进,新成立的Node.js性能团队重新关注了性能。这些改进包括对运行时的核心部分进行优化,如URL、 fetch()EventTarget

其中一个值得注意的改进是减少了初始化 EventTarget 的成本,它被削减了一半,从而使使用它的所有子系统的访问速度加快。此外,V8快速API调用已被用于提高 URL.canParse() 和定时器等API的性能。

另一个具体的变化是加入了更新的2.0版本的Ada,这是一个用C++编写的快速且符合规范的URL解析器。

小结

在这篇文章中,你已经了解了Node.js v20带来的一些主要功能(实验性和稳定性)和改进,比如对V8 JavaScript引擎的改进、性能、测试运行器和实验性权限模型的引入,以及单次执行应用程序。

需要知道的是,Node.js v14将在2023年4月进入生命末期,所以建议开始计划升级到Node.js v18(LTS)或vNode.js 20(即将成为LTS)。

评论留言