Node.js 17有哪些新特性?

2,056 阅读4分钟

​ 刚刚发布的Node.js v17.0.0,是目前JavaScript一个最新的主要版本。它取代了之前的 V16,是目前的 Current Latest Features (CLF)。因为V16 为偶数版本,所以官方计划在2021年10月26日升级到 long-term support (LTS)。

tip:Node.js奇数版本每年的10月份发布,偶数版本第二年的4月份发布,当一个奇数版本发布后,那么最近的一个偶数版本会立即进入LTS维护计划。

​ 尽管这是一个相对较小的更新,但此版本主要改进的是执行时的一些问题,包括:支持更多的API,JavaScript引擎升级和对OpenSSL 3.0的支持。

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

基于Promise的一些新API

​ Node官方继续承诺将核心 API 作为其战略发展(strategic initiative)计划的一部分。过去发布的几个Node.js主要版本,基于Promise的一些 API 已经添加到了 dns, fs, stream, 和 timers 这些模块中。

​ 在 Node.js 17中,这项承诺工作已经拓展到了readline 模块,它主要用于接收来自命令行的输入,新的API可以通过 readline/promises 模块来进行访问。

​ 在 Node.js v16 以及更早的版本中,我们对于readline 模块的的使用需要涉及到回调函数,如下所示:

// main.js
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 进行替代,如下所示:

// main.js
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();

包括了对于Stack的追踪

​ 当我们在分析异常报告信息时,会有一个常见的问题:该程序执行时的Node.js版本是什么?

​ Node.js17通过在Stack追踪末尾添加版本号,每当因未捕获到的异常导致进程结束时,那么可以很轻松的获取到此信息,如下所示:

file:///home/ayo/dev/demo/main.js: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

​ 如果你想在程序的 Stack 追踪中省略此信息,那么可以在启动Node.js脚本时,执行--no-extra-info-on-fatal-exception 这个命令。

更好的支持OpenSSL 3.0

​ Node.js 17 现在已经支持新推出的 OpenSSL 3.0 版本。

​ 其目的就是让OpenSSL 3.0 中的一些 API 和 以前 OpenSSL 版本中提供的 API 进行兼容。可是,由于对 allowable key sizesalgorithms (算法)更为严格的限制,就意味着可能会对生态产生一定的影响——尤其是那些目前还在使用small keys或者older algorithms的用户而言。

​ 在Node.js17 中,当你的应用程序或者它的依赖项使用的不是 OpenSSL 3.0 中允许的 algorithmkey size 时,那么在报错信息中就会包含 ERR_OSSL_EVP_UNSUPPORTED

​ 你可以使用 --openssl-legacy-provider 这条命令,启用 OpenSSL 3.0 对于之前版本程序的支持,来作为临时解除这些限制的办法。

将 V8 引擎升级到了 v9.5

​ 从 Node.js 17 开始,JavaScript的v8引擎已经更新到了v9.5。这个版本的主要变化主要是拓展日期和日历,以及国际化的时区输出。他还贯彻了旨在与当前基于JavaScript的解决方法相比减少开销的 WebAssembly 异常处理提案

弃用和删除

​ 作为一个主要版本,Node.js 17 也进了一些 弃用和删除。有一个值得注意的是:不推荐使用导入映射规范中,不支持的尾部斜杠模式进行映射。

怎么升级到Node.js 17

​ 你可以直接在 Node.js官方下载地址 中选择适合你的操作系统和架构的版本进行下载。有一个更好的方式在你的计算机上管理 Node.js 版本,那就是使用类似 Volta 这样的Node.js 环境管理工具,它可以允许你在多个 Node.js 版本之间无缝安装和切换。

​ 之后下载 Volta CLI ,通过执行下边的命令来下载最新版本的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 时,那么它可以和你已安装的其它版本共存。

​ 你也可以使用下面这条命令,列出你的 toolchain 中所使用的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 官方发布说明 中查看到关于此版本的bug修复,新功能以及其它变化的完整内容。

​ 如果你想要了解关于 Node.js 项目以及该如何 contribute,那么可以查看在该项目在 GitHub仓库上的 open issuescontribution guidelines

​ 感谢你的阅读,祝你Coding愉快!