AI 年度盘点与2025发展趋势展望,50+案例解析亮相AICon 了解详情
写点什么

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:2113234

评论

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

CSS修改单选框样式(element)

肥晨

11月月更 单选框样式修改 element单选框样式

万物皆可集成系列:低代码对接Web Service接口

葡萄城技术团队

什么是“数字孪生”?有什么价值?

雨果

数字孪生

国企数字化转型全是坑?看这几个成功案例,减少90%损失

雨果

数字化转型

Meta Force 原力元宇宙dapp系统开发(智能合约部署)

开发微hkkf5566

深圳市数字经济指数发布:数字经济蓬勃发展,数字用户深度渗透

易观分析

数字经济 深圳

完整会议议程:NGINX Sprint China 2022 年度线上大会

NGINX开源社区

nginx

《深入理解JavaScript特性》学习总结2-ES6基础知识点总结

肥晨

11月月更 ES6基础知识点总结 解构赋值

2022开源之夏|EMQ三大开源项目开发圆满收官

EMQ映云科技

开源 物联网 IoT mqtt 11月月更

20个值得收藏的实用JavaScript技巧

千锋IT教育

商业银行普惠金融可持续发展综合能力呈现梯队化,专项领域各有所长

易观分析

普惠金融

用户体验成为继MAU后,手机银行竞争分化的下一分水岭,易观千帆重磅发布手机银行APP用户体验GX评测

易观分析

App 手机银行

为什么晶闸管能在大电流下工作?

元器件秋姐

元器件采购 元器件电商 元器件知识 华秋商城 晶闸管

袋鼠云数栈UI5.0体验升级背后的故事:可用性原则与交互升级

袋鼠云数栈

数据中台选型必读(四):要想中台建的好,数据模型得做好

雨果

数据中台

基于 MQ 的分布式 Serverless 多租任务处理系统架构演进

Apache RocketMQ

消息队列 异步调度 #Serverless 任务

低学历并不是阻碍职业发展的绊脚石

测吧(北京)科技有限公司

软件测试

3年测试经验跳槽成功拿下30W+年薪

测吧(北京)科技有限公司

软件测试

redhat运维-远程日志记录

阿柠xn

运维 日志 linux 文件权限控制 11月月更

大规模预训练模型:探讨与展望

澜舟孟子开源社区

2022年互联网主要技术方向招聘需求变化:人工智能岗位需求增加87.7%;SQL在就业语言需求中位列第一

雨果

sql

图文实录|UIE:基于统一结构生成的通用信息抽取

澜舟孟子开源社区

这家公司的码农有多牛,用C++重写Kafka,还能与其API兼容

雨果

Kafk

OpenYurt v1.1.0: 新增 DaemonSet 的 OTA 和 Auto 升级策略

阿里巴巴云原生

阿里云 开源 云原生 openyurt

《深入理解JavaScript特性》学习总结1-ES6基础知识点总结

肥晨

箭头函数 11月月更 ES6基础知识点总结

数字化开采|AIRIOT智慧矿山自动化生产解决方案

AIRIOT

低代码 物联网 智慧矿山

数据中台选型必读(五):中台建设本质就是构建企业的公共数据层

雨果

数据中台

为什么面试官狂问八股文?我已经被三家公司问到哑口无言……

程序知音

Java java面试 java架构 后端技术 Java面试八股文

这些小技巧,让你的前端编程更优雅

好程序员IT教育

前端

Github上架3天星标55K,阿里最新产架构师速成手册成功颠覆了我的认知

程序员小毕

分布式 微服务 程序人生 架构师 Java后端

脑机直播 x 赛博驱魔!瑞云专访揭秘胶囊计划国风科幻神作《终极体验》制作幕后...

Renderbus瑞云渲染农场

3D动画 动画制作 瑞云专访

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