
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中引入的变化,深入了解其新特性和功能。
安装Node.js v20与其他版本的非常相似。你所需要做的就是:
node -v

Node.js v20的安装
如果你看到版本号(v20.0.0),这意味着Node.js已经正确安装,你可以开始使用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/目录内所有文件夹的读取权限。
进程对象的权限属性也可以用来检查在运行时是否被授予了特定的权限。例如,如果你想检查你的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模块,它使开发人员能够快速、轻松地构建和运行测试套件,而无需安装额外的依赖。
稳定版测试运行器现在包括几个构建模块,如 describe 、 it/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 标志提供实验性的测试覆盖率和嘲弄功能。
虽然不打算取代全功能的测试框架,如或,但稳定的测试运行器提供了一个简单而快速的 *** 来创建测试套件。自从在Node.js v19中引入以来,它已经得到了显著的增强,并且由于最终用户的测试和反馈,它现在已经在Node.js v20中被标记为稳定。
更多信息可以在这个中找到。
为Node.js提供动力的V8 JavaScript引擎在Node.js v20中已经更新到了11.3版本。这带来了更好的性能,并引入了新的语言功能。这次更新的一些新功能包括:
String.prototype.isWellFormed 和 toWellFormed : 这些 *** 对于确保正确的字符串格式特别有用。这有助于确保用户的字符串输入是正确的UTF-16格式,减少在表情符号时代的错误。ArrayBuffer 和可增长的 SharedArrayBuffer :提供更大的灵活性,允许更有效的内存分配。这些更新展示了Node.js开发社区对改善性能和功能的持续承诺。
在Node.js v20中,引入了 import.meta.resolve() ,这使得编写对位置不敏感的脚本更加容易。这个函数同步返回,类似于浏览器行为,允许更有效的执行。
用户加载器解析钩子仍然可以被定义为一个异步函数,但即使加载了异步解析钩子, import.meta.resolve() 仍将为应用程序代码同步返回。
import.meta.resolve() 的同步行为允许更有效的代码执行,特别是在处理大量数据的时候。作为作者,你可以将解析钩子定义为异步或同步函数,这取决于你的偏好。无论是否加载了异步解析钩子,应用程序代码仍将同步执行。
实验性单一可执行应用程序(SEA)是Node.js v20中引入的一项新功能,它允许将你的应用程序与Node.js二进制文件捆绑在一起,使最终用户能够将其作为单一可执行文件分发和运行。
这是社区长期以来的要求,团队在过去一年中一直在完善这一 *** 。
在Node.js v20中,构建单个可执行应用需要注入Node.js从 *** ON配置中准备的blob,而不是注入原始 *** 文件。
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应用程序,而不要求用户。该功能是由创建的,他在Open *** World上获得了JavaScriptlandia奖的一部分,获得了新来者的杰出贡献奖。
作为Open *** 基金会的成员,微软正在调查这项功能,作为减少矢量攻击和赋予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)。
不久前,PHP 8.0大张旗鼓地发布了。它带来了许多新特性、性能增强和变化——其中最令人兴奋的是新的JIT编译器。 技术世界总是在向前发展,PHP也是如此。 ,包含了几个令人兴奋的特性。它定于今年晚些时候于2021年11月25日发布。 在本文中,我们将详细介绍PHP 8.1将带来哪些新的东...
宝塔面板中的网站管理是非常重要的一部分,也是站长经常需要使用到的功能模块。网站管理,主要用于管理和创建WEB站点。如果您是宝塔面板的使用用户,应该对此模块有充分的了解,以便于您更高效地管理网站。 宝塔面板网站管理模块包括:添加新网站、修改默认页、设置默认站点、站点列表、站点的运行与停止、备份站点、...
宝塔面板的计划任务,主要用于安排和管理需要定时执行的任务,如备份、内存清理等。其实对于大部分站长来说,主要使用该板块的备份网站、备份数据库及释放内存的三个定时任务计划。 Shell脚本的添加 输入任务名称,选择执行周期,输入执行的脚本内容。 注意事项: 输入脚本内容...
经过几个小时的努力工作后,您是否感到眼睛疲劳或难以阅读代码?许多程序员在开始头疼之前从没想过要切换字体。 如果您经常发现在尝试扫描一千行代码时眼睛模糊不清,或者在停止编码数小时后头疼,那么可能是时候尝试一种新字体了。即使您没有遇到这些症状,设计良好的字体通常也比默认系统字体具有更好的可读性。...
想成为一名网络开发人员或好奇工作的哪些子类型的薪水最高?Web开发是一个竞争激烈、多样化的行业,随着新语言和框架的出现而不断发展。 询问Web开发人员的薪水是一个难以解决的问题(尽管我们尝试)。有太多的因素需要考虑。 无论您是自由开发者还是有兴趣从事更传统的工作、喜欢前端或后端工作,或者想知...
美国劳工统计局估计在美有超过软件开发人员。根据2021年的数据,其中,这是世界上使用最广泛的五种编程语言之一。 自然,学习Java并成为Java开发人员对于任何对软件开发感兴趣的人来说都是明智的职业选择。 在本综合指南中,您将学习成为Java开发人员所需的一切知识。我们将分解您需要的技能、工...