探索Node.js 12:简介与特性

发表时间: 2019-05-11 08:31

本博文由Bethany Griggs和Michael Dawson撰写,Node.js发布团队和技术指导委员会提供了技术内容支持。

今天我们很兴奋地宣布Node.js 12发布了。重大的更新和特性包括更快的启动速度和更好的默认堆限制、对V8、TLS、llhttp的更新, 新的特性包括诊断报告、捆绑式堆备份功能和对线程池、N-API和ES6模块支持的更新等等。Node.js 12版本替换了我们当前发布线中的版本11。Node.js发布线将在2019年10月成为Node.js长期支持(LTS)版本(更多关于LTS策略的细节请查看这里)。(
https://github.com/nodejs/release )

V8 更新: V8 更新至 V8 7.4

一如既往,V8 JavaScript引擎的新版本带来了性能的调优和改进,同时也使Node.js与语言和运行时的不断改进保持一致。更新亮点包括:

  • 异步堆栈跟踪: https://v8.dev/blog/v8-release-72#async-stack-traces
  • 参数不匹配的更快调用: https://v8.dev/blog/v8-release-74#faster-calls-with-arguments-mismatch
  • 更快的 await: https://v8.dev/blog/v8-release-73#faster-await
  • 更快的 javascript解析: https://v8.dev/blog/v8-release-72#javascript-parsing

请访问 官方博客获取更多有关V8的信息。(https://v8.dev/blog )

你好TLS 1.3

Node.js 12引入了TLS1.3支持,并使其成为默认的最大协议,同时还支持CLI/NODE_OPTIONS开关,以便在必要时禁用它。

TLS1.3是TLS协议的一个重大更新,进行了许多安全性增强,在可能的情况下应优先于TLS1.2来使用。

TLS1.3非常不同,以至于在使用TLS1.3时,即使是OpenSSL API在技术上也是API/ABI兼容的,但是协议记录和回调时间的更改打破了硬编码到“tls”模块中的假设。在使用TLS1.2时,此更改不会引入API不兼容性。它的目的是将其向后移植到当前和LTS发布线中,并将缺省的最大TLS协议重置为“TLSv1.2”。这将允许那些发布线的用户在需要时显式地启用TLS1.3。如果您想阅读更多内容,请查看以下相关文章:
https://developer.ibm.com/blogs/openssl-111-has-landed-in-nodejs-master-and-why-its-important-for-nodejs-lts-releases/ ,
https://developer.ibm.com/blogs/tls13-is-coming-to-nodejs/ 。

正确配置默认堆限制

本次更新将根据可用内存来配置JavaScript堆大小,而不是使用V8为浏览器设置的默认值。在以前的版本中,除非进行了配置,否则V8默认会将32位和64位平台上的最大堆大小分别限制为700 MB或1400MB。根据可用内存配置堆大小可以确保Node.js不会尝试使用超过可用内存的内存,并在内存耗尽时终止运行。

这在处理大型数据集时特别有用。与以前一样,如果默认值不适合您的应用程序,你仍然可以设置-max-old-space-size来使用不同的限制。

将默认http 解析器切换为 llhttp

Node.js 12也将把默认解析器切换到llhttp。这将是有益的,因为它将使测试和比较新的基于llhttp的实现更加容易。在v11.2.0中首次引入llhttp实验版本(
https://github.com/nodejs/node/pull/24059 ),而在本版本中llhttp(
https://github.com/indutny/llhttp )将跳出实验版本。

使本地模块的构建和支持更容易 — 过程延续

Node.js 12延续了使构建和支持本地模块更容易的趋势。其中的更改包括更好地支持与线程池结合的本地模块,以及N-API (
https://nodejs.org/api/n-api.html#n_api_n_api )版本4(也已经被向后移植到8.x和10.x版本),这使得你可以更容易地使用自己的线程来实现本地异步函数。这里有一篇很不错的文章,你可以了解更多关于它的信息,以及如何在你的模块中利用它:
https://medium.com/the-node-js-collection/new-features-bring-native-add-ons-close-to-being-on-par-with-js-modules-cd4f9b8e4b4

工人线程

工人线程(
https://nodejs.org/api/worker_threads.html )虽然在这个版本中并不新鲜,但仍然在不断取得进展。工人线程的使用不再需要使用一个标志,而且它们正朝着跳出实验性质的方向稳步前进。虽然Node.js在单线程事件循环中已经表现得很好,但是在某些用例中,可以利用额外的线程来获得更好的结果。我们希望你能够尝试它们,并让我们知道你有哪些有用的工人线程用例。想要获得工人线程的快速介绍,请查看这篇文章 :https://medium.com/@
Trott/using-worker-threads-in-node-js-80494136dbb6 。

诊断报告

Node.js 12 带来了一个新的实验特性——“诊断报告”。这允许你根据需要或在某些特定事件发生时生成一个报告。该报告包含的信息有助于诊断生产环境中的问题,包括崩溃、性能低下、内存泄漏、CPU使用率高、意外错误等等。 请查看这篇文章获取更多信息:
https://medium.com/the-node-js-collection/easily-identify-problems-in-node-js-applications-with-diagnostic-report-dc82370d8029 。

堆备份

如果你曾经为了研究内存问题而需要生成堆备份,但是由于必须在生产环境中安装一个新模块而降低了速度,那么好消息是Node.js 12提供了现成的集成堆备份功能。你可以查看
https://github.com/nodejs/node/pull/27133 和
https://github.com/nodejs/node/pull/26501 中的文档内容获取更多信息。

启动速度改进

在Node.js 11我们对工人线程提供了内置代码缓存支持——当加载用JavaScript编写的内置库时,如果这些库之前在主线程中编译过, 那么工人线程不再需要从头编译它,而是可以重用由主线程生成的v8代码缓存(
https://v8.dev/blog/code-caching )加来快编译。类似地,主线程可以重用工人线程生成的缓存。这使得工人线程的启动速度提高了大约60% (
https://github.com/nodejs/node/pull/24950 )。

现在在Node.js 12中,我们在构建库时预先为内置库生成代码缓存(
https://github.com/nodejs/node/pull/27161 ),并将其嵌入到二进制文件中,因此在最终版本中,主线程可以使用代码缓存来启动任何用JavaScript编写的内置库的初始加载。这使主线程的启动速度提高了30%左右。

ES6 模块支持

Node.js 12带来了对ES6模块支持的更新的实验性版本。这是迈向实现支持的重要一步,我们希望你尝试一下并给我们一些反馈。想了解更多细节,请查看这篇很棒的博客文章(https://medium.com/@
nodejs/announcing-a-new-experimental-modules-1be8d2d6c2ff )。

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

Node.js和V8继续包含更新的C++特性,并利用了更新的编译器优化和安全性增强。随着Node.js 12的发布,代码库现在在除了macOS和Windows之外的平台上至少需要GCC 6和glibc 2.17。Node.js 官网上发布的二进制文件使用了这个新的工具链的最低版本,因此包含了新的编译时性能和安全性增强。

最低版本编译器和libc需求的增加也导致了最低支持平台的增加。使用glibc的平台(除macOS和Windows之外的大多数平台)现在必须包含最低版本2.17。与此版本兼容的常见Linux平台包括Enterprise Linux 7 (RHEL和CentOS)、Debian 8和Ubuntu 14.04。从nodejs.org获得的二进制文件都兼容这些系统。用户在没有本地化支持GCC 6的系统上编译自己的二进制文件时,可能需要使用自定义的工具链。尽管Node.js 12.0.0或许可以使用较老的编译器进行编译,但预计Node.js 12代码库(包括V8)将在pre-LTS时间框架内迅速采用GCC 6支持的C++特性。

Windows平台的最低要求和Node.js 11一样,系统平台至少是Windows 7、2008 R2或2012 R2,编译器的最低要求是Visual Studio 2017。需要编译Node.js的macOS用户的编译器最低要求是Xcode 8,而nodejs.org上提供的Node.js二进制文件支持的最低平台是macOS 10.10“Yosemite”。

更多细节请查看Node.js中的 BUILDING.md(
https://github.com/nodejs/node/blob/v12.x/BUILDING.md#platform-list )。

致谢!

非常感谢所有为此版本的发布做出贡献的人,无论你是提交了一个推送请求、帮助我们进行基准测试,还是负责其中一个版本。我们还要感谢Node.js构建工作组(
https://github.com/nodejs/build )为我们提供的创建和测试版本的基础设施。Node.js 12的发布经理是Bethany Griggs。有关发布团队成员的完整列表,请访问这里(
https://github.com/nodejs/release#releasers-team )。您可以在这里(
https://github.com/nodejs/node/blob/master/doc/changelogs/CHANGELOG_V12.md )阅读有关完整功能列表的更多信息。

如果您有兴趣为Node.js做贡献, 我们欢迎你。请通过我们的贡献者指南(
https://github.com/nodejs/node/blob/master/CONTRIBUTING.md )了解更多信息。

英文原文:
https://qiniumedia.freelycode.com/vcdn/1/优质文章长图3/node12.pdf

译者:测试