Node.js 20 已发布,但我还在用 Node.js 10!

5027414a11a3fd9f5d455119aae2fda9.jpeg

Node.js v20.0.0[1] 版本于 2023 年 4 月 18 日发布,带来了很多新的亮点特性,下文介绍。未来 6 个月内做为 Current 版本,之后到 2023 年 10 月 24 日进入 LTS 长期支持。与此同时 v14.x LTS 版本将于本月底结束。

下面是 Node.js 当前各版本的发布时间表。81988e1a00831f6e5e3bf12b5c6564ac.png

有些朋友看到这里会想,这版本迭代也太快了吧,v20 都来了,可我却还在用 v10(可能会更低)!要不要一把梭直接升上去?

当前不能了,这种跨越式的大版本升级难免会有些 API 的兼容性问题,项目中用到的一些 NPM 库也会出现一些不兼容问题,例如 nodemailer 这个库就出现过因为不同 Node 版本下 Stream API 的实现差异,而导致的内存泄漏问题,遇到这种问题是最难排查的。

生产服务主要还是以稳定为主。在 Node.js 中每次大版本的升级也都是随着用户需求的不断变化,增加一些新特性、开发体验更好的 API、依赖库的升级。例如 V8 引擎,新版本的 V8 引擎会带来更好的性能和新的 JavaScript 特性。如果是一些新服务或自己学习可以尝试去用最新 Node.js 版本,生产服务还是要用稳定的 LTS 版本,注意 v20.0.0 在下半年 10 月份才会进入 LTS 长期维护阶段。

下面让我们一起来看看 Node.js v20  版本中的一些显著的特性更新:

权限模型

权限模型是 Node.js “师兄弟” Deno 发布时的一个亮点了,号称具有 “安全性”。现在 Node.js 也有了,这差异性是不是又缩进了一步?

Node.js 的权限模型默认不会开启,需要在启动程序时指定 --experimental-permission 标志位来开启,这也是对之前版本的一种兼容。

node --experimental-permission index.js

当权限模型启动之后,访问文件系统、子进程模块、工作线程模块都会增加限制。运行上述命令后,会得到以下错误提示:

31a0dc46c2240b193a538ca5d6b3c9fb.png

现在你必须设置--allow-fs-read--allow-fs-write 标志位来允许访问的文件。官方文档示例 --allow-fs-read=* 中,如果给予 * 号将允许所有文件的读操作,但在当前 v20.0.0 版本会报 no matches found: --allow-fs-read=* 错误,还是要先指定下路径。

node --experimental-permission --allow-fs-read=/User/Nodejs-Example/ --allow-fs-write=/User/Nodejs-Example/ index.js

精确的文件读写权限控制在服务端有一些好处。例如,获取数据经过处理后先放到某个临时的文件下,等数据消费完成后,不需要此临时文件了,当删除此临时文件时因为有了权限的一些限制,能规避一些意外的误删风险。也可防范一些三方库做一些恶意的文件操作。

除了文件模块权限控制之外还有:--allow-child-process 限制子进程访问、--allow-worker 限制工作线程访问。

稳定的 Test Runner

在 Node.js v20.0.0 版本中,该模块已被标记为稳定。稳定的 Test Runner 包括用于编写和运行测试的构建块,包括以下几点:

  • 使用 describe, it/test 和 hooks 来构造测试文件

  • 数据 Mock

  • watch mode:在监视模式下,测试运行器将监视测试文件及其依赖项的更改。当检测到更改时,测试运行器将重新运行受更改影响的测试。测试运行器将继续运行,直到进程终止。

  • node --test:并行运行多个测试文件,node --test test1.js test2.mjs

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");
});

以下是运行 node --watch index.mjs 命令后,在 watch mode 模式下随着文件的变动,测试用例也会重新执行。

49af2e1f240a1605a09395a752030f30.png

V8 引擎升级到 11.3

V8 引擎做为 Node.js 核心的模块之一,大版本更新通常会涉及到 V8 引擎的升级,也会为 Node.js 带来一些新的 JavaScript 特性和更好的性能。包括以下几点:

  • String.prototype.isWellFormed 和 toWellFormed[2]

  • 通过复制改变 Array 和 TypedArray 的方法[3]

  • 可调整大小的 ArrayBuffer 和可增长的 SharedArrayBuffer[4]

  • RegExp v flag with set notation + properties of strings[5]

  • WebAssembly 尾调用[6]

其它的一些更新

  • Node.js 最近新成立的性能团队,开始重新关注一些性能问题。Node.js 20 对 URL、fetch()、EventTarget 做了一些改进。

  • 单个可执行应用程序现在需要注入一个 Blob[7]

  • Web Crypto API[8]

  • Windows 官方支持 ARM64。

  • Web Assembly 系统接口(WASI)进展。

对 Node.js 版本不了解的,可参见笔者之前写的这篇文章!“Node.js 版本知多少?又该如何选择?”

参考资料

[1]

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

[2]

String.prototype.isWellFormed 和 toWellFormed: https://chromestatus.com/feature/5200195346759680

[3]

通过复制改变 Array 和 TypedArray 的方法: https://chromestatus.com/feature/5068609911521280

[4]

可调整大小的 ArrayBuffer 和可增长的 SharedArrayBuffer: https://chromestatus.com/feature/4668361878274048

[5]

RegExp v flag with set notation + properties of strings: https://chromestatus.com/feature/5144156542861312

[6]

WebAssembly 尾调用: https://chromestatus.com/feature/5423405012615168

[7]

单个可执行应用程序现在需要注入一个 Blob: https://github.com/nodejs/node/pull/47125

[8]

Web Crypto API: https://github.com/nodejs/node/pull/46067

- END -

5f5fc23c3d666ba4f8d0caa7e392fb90.gif

敬请关注「Nodejs技术栈」微信公众号,期望与志同道合的你一起打造优质 “Nodejs技术栈” 交流群,一起互相学习进步!可长按下方二维码添加【五月君】个人微信备注 “Node” 邀请入群。

832ec9bac514a24b184f50d31e681ed9.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值