Node.js 17 新特征

3,496 阅读3分钟

「这是我参与11月更文挑战的第 4 天,活动详情查看:2021最后一次更文挑战」。

Node.js v17.0.0,是 JavaScript 运行时的最新主要版本,上个月刚发布,它将取代运行时当前发行版中的 V16V16 现在有望在 2021 年 10 月 26 日升级到长期支持 (LTS) 频道。

尽管是一个相对较小的更新,但此版本为运行时带来了多项改进,包括更多承诺的 APIJavaScript 引擎升级OpenSSL 3.0 支持。

在本文中,将了解此版本 v17.0.0 的一些主要亮点以及对 Node.js 开发人员的影响。

基于 Promise 的 API

Node.js 继续承诺将其核心 API 作为其战略计划的一部分。在最近几个主要的 Node.js 版本中,为 dnsfsstreamtimers 模块添加了基于 Promise 的 API。

在 Node.js 17 中,这种正在进行的承诺工作已扩展到 readline 模块,主要用于接受来自命令行的输入,新的 API 可通过 readline/promises 模块访问。

在 Node.js v16 及更早版本中使用 readline 模块的旧方法涉及使用回调函数,如下所示:

import readline from "readline";
import process from "process";

const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout,
});

rl.question(`What's your name?`, (name) => {
    console.log(`Hi ${name}!`);
    rl.close();
});

从 Node.js 17 开始,可以在从 readline/promises 导入时使用 await

import readline from "readline/promises";
import process from "process";

const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout,
});

const name = await rl.question(`What's your name?`);
console.log(`Hi ${name}!`);
rl.close();

堆栈跟踪

在诊断报告的问题时,一个常见的问题是:执行程序的 Node.js 版本是什么?

每当未捕获的异常导致进程退出时,Node.js 17 通过在堆栈跟踪的末尾添加版本号信息,从而更容易获取此信息:

file:///workspace/quintion/dev/demo/main.mjs:1
throw new Error("Uncaught exception");
      ^

Error: Uncaught exception
    at file:///workspace/quintion/dev/demo/main.mjs:1:7
    at ModuleJob.run (node:internal/modules/esm/module_job:185:25)
    at async Promise.all (index 0)
    at async ESMLoader.import (node:internal/modules/esm/loader:281:24)
    at async loadESM (node:internal/process/esm_loader:88:5)
    at async handleMainPromise (node:internal/modules/run_main:65:12)

Node.js v17.0.0

如果希望在程序的堆栈跟踪中忽略版本信息,则可以在启动 Node.js 脚本时使用 --no-extra-info-on-fatal-exception 命令行标志。

OpenSSL 3.0 支持

Node.js 17 现在支持新发布的 OpenSSL 3.0 版本。

目标是使 OpenSSL 3.0 中的 API 与以前的 OpenSSL 版本中提供的 API 兼容。但是,对允许的密钥大小和算法的更严格限制意味着可能会对生态系统产生一些影响,尤其是对于仍在使用小密钥或旧算法的用户

当应用程序或其依赖项使用 OpenSSL 3.0 中不允许的算法或密钥大小时,这种影响反映在 Node.js 17 中的错误消息 ERR_OSSL_EVP_UNSUPPORTED 中。

可以使用 --openssl-legacy-provider 命令行标志来启用 OpenSSL 3.0 旧版提供程序来兼容,作为缓解这些限制的临时方法。

V8升级到v9.5

Node.js 17 开始,v8 JavaScript 引擎已更新到 v9.5。此版本中的更改主要目的在扩大日期和日历以及时区输出的国际化。它还实现了 WebAssembly 异常处理提案,与当前基于 JavaScript 的解决方法相比,旨在减少开销。

弃用和删除

作为一个主要版本,Node.js 17 还附带了一些弃用和删除。值得注意的是,导入 Map 规范不支持尾随斜杠模式 Map 的弃用。

升级到 Node.js 17

可以使用 Node.js 下载页面上提供的适用于操作系统和架构的相应链接将 Node.js 17 下载 到计算机上进行安装。

在机器上管理 Node.js 版本的更好方法是使用像 Volta 这样的 Node.js 环境管理工具,它允许在多个 Node.js 版本之间无缝安装和切换。

安装 Volta CLI后,运行以下命令安装最新版本的 Node.js:

$ volta install node@latest

可以使用以下语法安装特定版本:

volta install node@16.9.0 # 安装版本 v16.9.0

当使用 Volta 安装 Node.js 版本时,它将与已安装的任何其他版本共存。

可以使用以下命令列出工具链中的 Node 运行时版本:

volta list node

可以在官方 Node.js v17 发行说明中查看此版本中包含的错误修复、新功能和其他更改的完整列表。