Node.js 17 中的新增功能

535 阅读4分钟

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


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

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

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

新的 Promise API

Node.js 继续承诺将其核心 API 作为其战略计划的 一部分。在过去的几个主要Node.js的释放,对于添加基于承诺的API dnsfsstream,和timers模块。

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

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

// main.mjs
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 开始,您现在可以await在从 from 导入时 使用readline/promises

// main.mjs
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 版本是什么?

每当未捕获的异常导致进程退出时,Node.js 17 通过在堆栈跟踪的末尾包含版本号,从而更轻松地提供此信息:

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

Error: Uncaught exception
    at file:///home/ayo/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

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

支持 OpenSSL 3.0

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

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

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

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

JavaScript V8升级到v9.5

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

弃用和删除

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

升级到 Node.js 17

您可以使用Node.js 下载页面上提供的适用于您的操作系统和体系结构的相应链接将 Node.js 17 下载到您的计算机。在您的机器上管理 Node.js 版本的更好方法是使用像Volta这样的 Node.js 环境管理工具 ,它允许您在多个 Node.js 版本之间无缝安装和切换。

运行命令下面安装最新版本的Node.js的:

$ volta install node@latest
success: installed and set node@17.0.1 (with npm@8.1.0) as default

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

$ volta install node@lts # install latest lts version
$ volta install node@16.9.0 # install specific version 16.9.0
$ volta install node@12 # install the latest v12 release

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

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

$ volta list node
⚡️ Node runtimes in your toolchain:

  v14.8.0
  v14.17.5
  v16.7.0
  v16.8.0
  v16.9.0
  v17.0.1 (default)

请参阅Volta 的在线文档,了解有关其工作原理和功能的更多详细信息。

备注说明

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

要了解有关 Node.js 项目以及如何贡献的更多信息,您可以 在项目的 GitHub 存储库上查看Node.js 未解决问题列表和Node.js 贡献指南

感谢阅读,祝您编码愉快!

PS 如果您喜欢这篇文章,请订阅我们的 JavaScript 魔法列表,每月深入了解更神奇的 JavaScript 技巧和窍门。

PPS如果您需要为您的Node.js应用的APM,去检查了AppSignal APM对Node.js的

我们的客座作者 Ayo 是一名软件开发人员。他喜欢撰写有关 Web 开发中各种技术的文章,主要是 Go 和 JavaScript/TypeScript。您可以通过他的博客了解更多关于他的信息。