Node.js 16 初体验

Node.js 16已经于4月20日发布,主要包括如下更新:

  • 升级V8引擎至9.0
  • 预构建的Apple silicon二进制文件以支持使用苹果芯片的Mac系统
  • 稳定部分API

详细更新日志可参考:https://nodejs.org/zh-cn/blog/release/v16.0.0/

Node.js发布时间表

可以在官网下载最新发布体验,或者使用版本管理工具(本文以跨平台的nvs为例)。

# 下载V16的Node.js
nvs add 16

# 在当前终端使用V16的Node.js(推荐)
nvs use 16
# 或者:设置全局默认的Node.js至V16
nvs link 16

查看node & npm版本

Node.js 16将会替代15并于接下来半年成为当前发布线(期间可能会有部分非紧要的代码更新),之后将于十月份进入长期支持(LTS)阶段并将该版本命名为Gallium。PS:V12会在2022年4月结束LTS阶段,V14为2023年4月,V10将于本月结束LTS阶段。

V8引擎的升级

每次V8引擎的升级都会带来性能的调整与提升以及支持最新的JavaScript语言特性,因此Node.js会常态化更新V8版本,Node.js 16使用V8 9.0(15使用的是V8 8.6)。

这次V8的升级带来了ECMAScript RegExp比对索引功能,能提供字符串的开始与结束索引。当正则表达式带有/d标签时,可以通过indices属性访问到索引数组。

RegExp match indice范例

更多V8更新请参考:https://v8.dev/

稳定Timers Promises API

Timers Promises API提供了可返回Promise对象的timer函数(无需再将timer通过util.promisify进行Promise化),该API于Node.js 15新增(本次发布将其从experimental状态更新为stable状态)。

import { setTimeout } from 'timers/promises';

async function run() {
  const res = await setTimeout(3000, 'fullFilledValue');
  console.log(`Get result=>${res} after 3s`);
}

run(); // 3s后输出:Get result=>fullFilledValue after 3s

其他特性

新的编译器与平台最低要求

Node.js针对不同的平台提供预构建的二进制文件,对于每个主要版本,在适当的情况下评估并提出最少的工具链。

Node.js v16.0.0是首个为apple芯片交付预构建二进制文件的版本,虽然将分别为Intel(darwin-x64)和ARM(darwin-arm64)架构提供压缩包,但macOS安装程序(.pkg)将作为“fat”(多架构)二进制文件提供。在基于Linux的平台上,构建Node.js 16的最低GCC级别将为GCC 8.3。详情请参考Node.js BUILDING.md文件

弃用

Node.js项目使用名为CITGM(Canary in the Goldmine)的工具,测试任何重大变化(包括弃用)对大量流行生态系统模块的影响,以在执行这些变化之前提供更多的参考。Node.js v16主要的弃用包括对多个核心模块内部执行process.binding()的运行时弃用,如process.binding(‘http_parser’)