Node.js 12.x-15.x 新特性

本文概述了Node.js 15.x的最新进展,包括加入AbortController处理请求中止、npm7带来的新功能如工作区和package-lock.json改进,以及V8引擎升级至8.6,涉及Promise.any、QUIC实验支持和N-API 7。此外,介绍了Node.js 14.x的诊断报告稳定、V8语言特性和异步本地存储API的实验性支持。

Node.js 15.x

主要的新功能有:

AbortController

AbortController接口表示一个控制器对象,允许开发者根据需要中止一个或多个 Web请求,Node.js 15 加入了 AbortController 的一个实验性实现。

AbortController 是一个全局实用工具类,可根据 AbortController Web API在选定的基于 Promise 的 API 中取消发出的请求信号。

const ac = new AbortController();
ac.signal.addEventListener('abort', () => console.log('Aborted!'),
{ once: true });
ac.abort();
console.log(ac.signal.aborted);    //Prints True

npm 7

Node.js 15 附带了 npm 的新大版本 npm 7。npm 7 有许多新功能,包括 npm 工作区和新的 package-lock.json 格式。

npm 7 还包括 yarn.lock 文件支持。npm 7 的一大变化是默认安装对等依赖项。

unhandled rejections 默认抛出

以前unhandled rejections默认是warn,15版本改为throw,在 throw 模式下,如果未设置 unhandledRejection hook,则会将 unhandledRejection提升为未捕获的异常。

process.on('unhandledRejection', (reason, promise) => {
  console.log('未处理的拒绝:', promise, '原因:', reason);
  // 记录日志、抛出错误、或其他逻辑。
});

somePromise.then((res) => {
  return reportToUser(JSON.pasre(res)); // 故意输错 (`pasre`)。
}); // 没有 `.catch()` 或 `.then()`。

QUIC(实验)

QUIC 是谷歌制定的一种基于UDP的低时延的互联网传输层协议,它是 HTTP/3 的基础传输协议。

Node.js 15 附带 QUIC 的实验性支持,可通过 --experimental-quic配置标志编译 Node.js 来启用。
在2016年11月国际互联网工程任务组(IETF)召开了第一次QUIC工作组会议,受到了业界的广泛关注,意味着QUIC开始在成为新一代传输层协议上迈出了关键的一步。

同时,QUIC 具有内置的 TLS 1.3 安全性、流控制、错误纠正、连接迁移和多路复用。

N-API 7

N-API是一个用于构建本机插件的C语言的API,它独立于底层JavaScript运行时环境(如V8),并作为Node.js本身的一部分。

它是为了将Addons插件和底层JavaScript引擎的改动隔离开来,并且允许在一个版本编译的模块不需要重新编译就可以在更高版本的Node.js上运行,它确保了Node.js版本和不同编译器级别之间应用程序接口(ABI)的稳定性。

V8 8.6

V8 JavaScript 引擎已更新为 V8 8.6(V8 8.4 是 Node.js 14 中的最新版本)。除了性能调整和改进之外,V8 更新还带来了以下语言特性:

  • Promise.any()
    Promise.any() 接收一个Promise可迭代对象,只要其中的一个 promise 成功,就返回那个已经成功的 promise 。如果可迭代对象中没有一个 promise 成功(即所有的 promises 都失败/拒绝),就返回一个失败的 promise 和AggregateError类型的实例,它是 Error 的一个子类,用于把单一的错误集合在一起。
  • AggregateError
    AggregateError主要用于操作报告多个错误被抛出的场景.
  • String.prototype.replaceAll()
    replaceAll() 方法是返回一个新字符串,新字符串所有满足 pattern 的部分都已被replacement 替换。pattern可以是一个字符串或一个 RegExp, replacement可以是一个字符串或一个在每次匹配被调用的函数。

Node.js 14.x

该版本的主要亮点:

  • 对诊断功能的改进
  • 升级v8引擎
  • 新增实验性的异步本地存储API
  • 强化流API
  • 移除实验性模块中的警告
  • 移除一部分早期版本中废弃的API

诊断报告变成稳定功能

新版本中诊断报告功能已稳定(12.x是实验版),用户能够按需或在某些事件发生时生成报告。该报告将提供有助于诊断生产问题的信息,包括崩溃、性能降低、内存泄漏、高CPU使用率和意外错误。

V8升级到8.1

其中值得注意的几大特性:

  • 支持 Optional Chaining
  • ?.操作符
const adventurer = {
  name: 'Alice',
  cat: {
    name: 'Dinah'
  }
};
 
const dogName = adventurer.dog?.name;
console.log(dogName);
// expected output: undefined
 
console.log(adventurer.someNonExistentMethod?.())
// expected output: undefined
  • 支持Nullish合并
    ??操作符
const foo = null ?? 'default string';
console.log(foo);
// expected output: "default string"
 
const baz = 0 ?? 42;
console.log(baz);
// expected output: 0
  • Intl.DisplayNames

是一个对象构造器,它支持语言、区域和脚本显示名称的一致翻译。

  • Intl.DateTimeFormat 启用 calendarnumberingSystem 选项

异步本地存储API (实验)

用于跟踪 NodeJs 中的异步资源的生命周期。

帮助管理多个版本之间异步调用上下文的API。实验性Async Hooks API 已在早期的版本中引入了。Async Hook 的关键用例之一是异步本地存储(也称为连续本地存储)。已经有许多npm模块提供了API来满足这种需求,但是这些年来,在 Node.js 核心之外维护这些功能一直很棘手;并且在这个项目上社区已经达成共识,认为由Node.js提供统一的API会更合理,因此14.x 版本带来了实验性的Async Local storage API(也在13.10中添加了该API)。

Streams API更新

提高了各种流的行为一致性,以提高Streams API的一致性,消除歧义并简化Node.js核心各个部分的行为。
例如 http.OutgoingMessagestream.Writablenet.Socket的行为完全相同于 stream.Duplex.

WASI (Web Assembly System Interface)(实验)

用Web Assembly编写的 Node.js包为某些使用场景带来了更好的性能和跨平台支持的机会。 为了支持这些场景,14.x版本中包含了Web Assembly系统接口(WASI)的实验性实现。虽然WASI对Node.js v14来说并不是新事物,但值得注意的是它在简化原生模块的体验上非常有潜力。

移除ESM modules警告

在 v13 中,需要调用--experimental-modules 来开启 ESM module 支持, 而且还会有警告,但目前已经移除警告(还是需要手动开启)
仍在实验中,但是其已经非常完善,移除警告迈向了stable的重要一步。

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

Node.js为很多平台提供了预构建二进制文件。针对每个主版本,都会对最小工具链做适当的评估和提高。
将 macOS 下的最低版本提高到了 macOS 10.13 (High Sierra)
将 linux,最低 GCC 提高到了 GCC6,node.js v14 也不会在结束维护的 Windows 发行版下维护。

Node.js 13.x

Node.js 13带来的新特性比较少,更多的是固定了部分属性的edge cases,并对一些不合理、但因为会产生breaking change,因为只能在大版本升级的问题进行了处理,包括:

  • fs.read/write支持传入最大为Number.MAX_SAFE_INTEGER的offset参数,而不再是原本限制为int32大小的数字。
  • http.ClientRequest在aborted事件发生后,不会再emit end和error事件;net.Socket发生error后,data事件不会再发生;host参数会被校验是否为字符串;request.connection和response.connection被移除,转而使用request.socket和response.socket替代。
  • assert.throws()和assert.rejects()要求表达式的值一定是true,而不是表达式的bool值为true。
  • http和http2 server默认的超时事件被移除;425状态码的描述根据RFC 8470进行了修改。
  • stream模块相关的一系列边缘case被固定了下来,并添加了相关测试。
  • 在macOS上,不再官方支持用Xcode 10以下的版本构建Node.js。

升级V8到7.8

对regexp性能进行了优化,使得regexp在编译速度和内存占用上都有了一定程度的优化。

Node.js 12.x

该版本带来了许多重大升级,包括更多的V8特性,http解析速度的提升,启动速度的提升,更好的诊断报告,内置堆分析工具,ESM模块的更新等。
重大更新和特性包括: 启动更快、更合理的默认堆限制、对V8内核及LTS的更新、引入llhtp,以及诊断报告、堆转储能力、Worker Threads更新、N-API和ES6模块支持的新特性。

V8内核更新,升级到7.4

更新新版本的V8引擎带来新的性能提升和改进,同时可以让Node.js及时跟进语言和运行时层面的新改进,主要包括:

  • Async stack traces
    异步堆栈跟踪,原生支持了 async 堆栈信息,不会添加额外运行时内容。
  • faster calls with arguments mismatch
    参数调用不匹配时的调用速度优化,即便参数传递多了或少了,现在都几乎不会影响 Node 的执行速度。
  • Faster awai
    更快的await,async /await 已经比 promises 快了两个 microticks。
  • Faster javascript parsing
    更快的Javascript解析速度,网页中的 V8 引擎一般花费 9.5% 时间在 JS 解析上,经过解析加速后,现在花费在 JS 解析上的时间降低到平均 7.5%。

TLS 1.3支持

Node.js 12引入了TLS1.3版本支持,并作为TLS默认开启的最高版本。支持通过CLI/NODE_OPTIONS 开关关闭。TLS1.3是 TLS 协议的主要更新,带了许多安全性增强且更易配置。

Properly configure default heap limits

根据可用内存配置JavaScript默认堆大小,而不是V8引擎在浏览器中使用时的默认配置。
在之前的发行版中,V8默认堆在32位和64位平台上分别被配置为700MB和1400MB。
根据可用内存大小配置堆内存可以确保Node.js尽可能小的使用内存,且在内存耗尽时能正确的终止。
这在处理大型数据集时特别有用。如果默认值不适合应用程序,可以设置 --max-old-space-size以使用不同的限制。

Switch default http parser to llhttp

Node.js 12将默认 http 解析器切换为 llhttp。这会使测试和比较新的基于 llhttp 的实现时更加容易。 llhttp在V11.2.0作为实验特性引入,在本次更新中将成为正式特性。
HTTP解析速度提升
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-T8SOsDpn-1604575793055)(en-resource://database/7597:1)]

启动速度提升

通过 v8 code cache 的支持,构建时提前为内置库生成代码缓存,从而提升 30% 的启动耗时。同时,通过重用主进程缓存,Workers Threads 的启动速度提升了 60% 。

Worker Threads

在 10.x 已经引入的 Workers Threads 特性,在 12.x 里面默认启用,无需使用 --experimental-worker开启。同时基于上一条的介绍,启动的速度也得到大幅提升。

诊断报告

提供了新的实验性功能『诊断报告』,一个非常有用的特性。可用于帮助分析诸如:崩溃,性能问题,内存泄漏,高 CPU 占用等等问题。

Heap Dump

在12.x版本中内置了堆转储的功能,可以按照可用内存动态调整堆大小了。

ESM模块方案更新

Node12 对 ES6 module 的支持依然处于实验阶段,需要通过--experimental-modules开启。简单来说,就是支持了 Import Export 语法,不需要再转成 require了, 如果在 package.json增加"type": "module"的配置,Node 将按照 ES6 module 方式处理。

其他更新

  • 更好的原生模块支持,N-API 升级为版本 4,并 backport 到 Node.js 8.x 和 10.x。
  • TLS 升级为 1.3, 增强安全功能。
  • 随着 C++ 编译器的更新,现在要求 GCC 6 和 glibc 2.17 ,对应的操作系统 Win7 和 macOS 10。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值