写点什么

Node.js 20 正式发布

  • 2023-04-19
    北京
  • 本文字数:3859 字

    阅读完需:约 13 分钟

Node.js 20正式发布

4 月 18 日,Node.js 在官方博客发布了 Node.js 20 版本。

 


新版亮点:


  • 引入权限控制模型 (Permission Model)

  • 同步的 import.meta.resolve

  • Test Runner 到达稳定状态

  • V8 JavaScript 引擎更新至 11.3,,增加了 5 个新特性

  • 支持构建单一可执行应用程序

  • Ada 更新至 2.0 等。

 

提醒一下,Node.js 14 已进入维护状态 (Maintenance LTS),名称为 Fermium,它将在 2023 年 4 月 30 日停止维护。Node.js 20 将于 10 月进入长期支持(LTS),但在此之前,它将是未来六个月的“当前”版本。我们鼓励大家探索这个最新版本提供的诸多新特性和优势,并评估它们对你的应用程序的潜在影响。

 

Node.js 项目在多个领域继续取得进展,许多新特性和修复已流入现有的 LTS 版本。因此,Node.js 20 的变更日志中介绍的更改只包含了自上一个主要版本以来该项目的一小部分新特性和工作。本文将在与这些更改相关的更广泛工作基础上介绍一些额外的内容。

 

进一步了解 Node.js 的发布政策:https://github.com/nodejs/release

 

下载 Node.js 20.0.0,请访问:https://nodejs.org/en/download/current/。发布文章地址:https://nodejs.org/en/blog/release/v20.0.0,其中有这个版本的完整提交列表。

 

重要更改

权限模型

 

Node.js 的权限模型(Permission Model)目前处于实验性阶段,用于在执行期间限制对特定资源的访问。

 

这个版本是包含权限模型的第一个版本,其中该特性具有以下能力:

 

  • 限制对文件系统的访问(读写)使用--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 的能力将受到限制。

 

引入--allow-fs-read 和--allow-fs-write 标志后,使用 Node.js 的开发人员现在可以更好地控制文件系统的访问权限了。这些实验特性允许开发人员更精细地控制 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'); // trueprocess.permission.has('fs.write', '/home/nodejs/protected-folder'); // true
复制代码

 

请务必注意,这些特性仍处于实验阶段,可能会在 Node.js 的未来版本中发生变化。权限模型文档中有更多信息。

 

权限模型是 Rafael Gonzaga 在#44004中的贡献。

 

自定义 ESM loader hooks 接近稳定版

 

通过加载器(--experimental-loader=./foo.mjs)提供的自定义 ES 模块生命周期 hooks 现在运行在与主线程隔离的专用线程中。这为加载器提供了单独作用域,并确保了加载器和应用程序代码之间没有交叉污染。

 

import.meta.resolve()现在会同步返回,与浏览器行为一致;请注意,如果 loader 作者需要,用户加载器中的 resolve hooks 可以保持异步,并且 import.meta.resolve 仍将在应用程序代码中同步返回。

 

这些更改是将 ESM 加载器标记为稳定之前的最后一项未完成的项目。如果一段时间后社区没有报告重大错误,我们打算将加载器标志、import.meta.resolve 以及 resolve 和 load hooks 标记为稳定。这样应该能让大家更广泛地采用 ESM,因为分析器开发商等重要支持者从此将拥有稳定的 API,可以在其上构建分析和报告库。

 

该特性由 Anna Henningsen、Antoinedu Hamel、Geoffrey Booth、Guy Bedford、Jacob Smith 和 Michaël Zasso 在#44710中贡献。

 

V8 升级至 11.3

 

按照惯例,Node.js 新版中包含了一个新版本的 V8 引擎(更新到了 11.3 版本,它是 Chromium 113 的一部分),带来性能提升和一些新的语言特性,包括:

 

V8 更新是 Michaël Zasso 在#47251中的贡献。


Test Runner 到达稳定状态

 

Node.js 20 的更新中还有对 test_runner 模块的重要更改。在最近的更新后,该模块已被标记为稳定。这个稳定的测试运行器包括了用于编写和运行测试的块,具体有:

  • describe、it/test 和 hooks 来构造测试文件

  • mocking

  • 观看模式

  • 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");});
复制代码

 

由 Colin Ihrig 在#46983中贡献。


性能表现

 

我们新成立了 Node.js 的性能团队后,自上一个主要版本以来大家对性能的关注大大增加。Node.js 20 对运行时的基本部分做了许多改进,包括 URL、fetch()和 EventTarget。

 

初始化 EventTarget 的开销减少了一半,这样就可以更快地访问使用它的所有子系统。此外,我们已利用 V8 快速 API 调用来提高一些 API 的性能,例如 URL.canParse()和计时器。

 

Node.js 20 还加入了一些更改,例如 Ada 的更新版本 2.0,这是一种用 C++编写的快速且符合规范的 URL 解析器。

 

我们期待一些新方法能进一步提高性能,我们目前正在努力通过重构来降低合规成本,设法消除 streams、URL、URLSearchParams 和字符串解码器的品牌验证检查。这样就能在我们的总体目标,也就是在有意义的位置做合规验证的道路上更进一步。

 

如果你对性能提升和 Node.js 充满热情,我们正在积极为我们的性能团队寻找贡献者,欢迎大家。

 

单个可执行应用现在需要注入一个 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 上进行了全面测试,以避免回归并确保兼容性。

 

Stefan Stojanovic 在#47233中将 ARM64 Windows 升级到了 tier 2 支持。

 

WebAssembly 系统接口(WASI)进展

 

本项目继续致力于改进 Node.js 中的 WASI 实现。新版取得的一项明显进步是,虽然它是实验性的,但不再需要命令行选项来启用 WASI。这应该能让它更容易消费。由于从事 WASI 工作的团队在做 preview2,因此这个版本还为未来计划做了一些更改,包括在调用 newWASI()时添加 version 选项。在 20.x 版本中 version 是必需的,没有默认值。这一点很重要,因为支持新版本的应用程序不会默认为可能已过时的版本。但这确实意味着任何依赖版本默认值的代码都需要更新以请求特定版本。

 

如果你有兴趣在 Node.js 中使用 WASI,或在 Node.js 之外使用uvwasi,我们的团队欢迎这方面的贡献者。

 

请大家开始尝新!

 

请大家试用新的 Node.js 20 版本!我们一直都很高兴听到大家的反馈。使用 Node.js 20 测试你的应用程序和模块,可以帮助确保你的项目在未来与最新的 Node.js 更改和特性保持兼容。

 

还需要注意的是,Node.js 14 将于 2023 年 4 月结束其生命周期,建议升级到 Node.js 18(LTS)或 Node.js 20(即将成为 LTS)。

 

请考虑 Node.js 16(LTS)将于 2023 年 9 月结束生命周期,比原来计划的 2024 年 4 月提前了,这是为了同 OpenSSL 1.1.1 的支持结束相一致。你可以在https://nodejs.org/en/blog/announcements/nodejs16-eol/阅读有关该决定的更多内容。

 

原文链接:

https://nodejs.org/en/blog/announcements/v20-release-announce

2023-04-19 21:2118350

评论

发布
暂无评论
发现更多内容

2022 开源之夏 | Serverless Devs 陪你“变得更强”

阿里巴巴云原生

阿里云 云原生 Serverless Devs 开源之夏

Django 如何获取 Model 字段列表?

AlwaysBeta

django

面试突击45:为什么要用读写锁?它有什么优点?

王磊

Java 面试

BI系统打包Docker镜像及容器化部署的具体实现

葡萄城技术团队

Docker 数据分析 BI BI 分析工具

Java并发机制的底层实现原理

急需上岸的小谢

5月月更

nginx配置系列(九)nginx中的防盗链

乌龟哥哥

5月月更

跟着动画学 Go 数据结构之二叉树

宇宙之一粟

数据结构 二叉树 Go 语言 5月月更

限时免费!六位袋鼠云数栈资深产品专家带来《数智赋能实战六讲》,欢迎报名

袋鼠云数栈

数据中台 大数据 开源

CentOS 8及以上版本配置IP的方法,你 get 了吗

伍工

Linux 网络

ChunJun支持异构数据源DDL转换与自动执行 丨DTMO 02期回顾(内含课程回放+课件)

袋鼠云数栈

大数据

千人千面工作台,轻松定制你的移动业务场景

BeeWorks

PyTorch 开发环境搭建

Emperor_LawD

PyTorch 5月月更

SAP 电商云启用 Enterprise Product Development Visualization Integration 的配置步骤

汪子熙

angular 电商 SAP commerce 5月月更

福昕软件:用PDF辅助技术弥合阅读障碍者的数字鸿沟

联营汇聚

五年谷歌ML Infra生涯,我学到最重要的3个教训

OneFlow

机器学习 深度学习 深度学习框架 MLOps Data Infra

python处理excel文件,python xlsxwriter 一文初掌握

梦想橡皮擦

5月月更

导航网站合集 | 你想要的资源它都有

小炮

超级全面的设计类网址导航

小炮

Nginx 和 Nginx Plus 的区别

HoneyMoose

《对线面试官》Java泛型

Java3y

Java 程序员 编程语言 java 5月月更

STM32+华为云IOT设计的动态密码锁

DS小龙哥

5月月更

【高并发】ThreadLocal学会了这些,你也能和面试官扯皮了!

冰河

并发编程 多线程 协程 异步编程 精通高并发系列

面试中被问到最多的 19 个 JavaScript 问题

海拥(haiyong.site)

JavaScript 5月月更

[Day37]-[二叉树]- 找树左下角的值

方勇(gopher)

LeetCode 二叉树 数据结构算法

LabVIEW串口调试助手

不脱发的程序猿

LabVIEW 串口通信 数据通信 串口调试助手 VISA

【Python】新华字典(bushi

謓泽

5月月更

【刷题第一天】蜡烛之间的盘子

白日梦

5月月更

消息队列Kafka「检索组件」重磅上线!

阿里巴巴云原生

阿里云 云原生 消息队列Kafka

数据大屏,仅仅是数据展示吗?

葡萄城技术团队

数据分析 BI 数据可视化 数据大屏 BI分析

轻量迅捷时代,Vite 与Webpack 谁赢谁输

葡萄城技术团队

前端 vite webpack 轮子

Docker下的Spring Cloud三部曲之二:细说Spring Cloud开发

程序员欣宸

Java spring-cloud 5月月更

Node.js 20正式发布_大前端_王强_InfoQ精选文章