本文由Michael Dawson 和 Bethany Griggs撰写,同时 Node.js 社区委员会和 Node.js 技术指导委员会也提供了贡献。

img

我们很高兴地宣布,Node.js 14已于今天发布!此版本的重点包括改进的诊断功能、V8 的升级、实验性的异步本地存储 API、流 API 的强化、实验模块警告的删除以及一些已过时的 API 的删除。

Node.js 14 取代了 Node.js 13 作为我们当前的发行版本。根据发布时间表(https://github.com/nodejs/Release#release-schedule),Node.js 14 是未来 6 个月的 Current 版本,到 2020 年 10 月再升级为长期支持版(LTS) 。企业用户应该等到 10 月将 Node.js 升级为 LTS 时,再将其用于生产部署。但现在是用 Node.js 14 测试你的程序并尝试新功能的最佳时间。

提醒一下 —— Node.js 12 和 Node.js 10 将分别保持长期支持,直到 2022 年 4 月和 2021 年 4 月(有关LTS策略的更多详细信息,请查看这里))。

立刻开始!在这里了解如何下载最新版本: https://nodejs.org/en/download/current/

在深入了解这一版本的新功能之前,请务必注意,添加到主版中的新功能会迅速流入当前版本。这意味着重要功能可以在次要版本中使用。我们想借此机会重点介绍 Node.js 14 版本中的某些功能,即使它们可能已经被移植到较早的版本中了。

诊断报告变得稳定

诊断报告将会在 Node.js 14 中作为稳定功能发布(在 Node.js 12 中作为实验性功能添加)。这是项目正在进行的工作中的重要一步,目的是建立使用 Node.js 时可用的诊断程序并改进它们的易用性,其中大部分工作由 Node.js 诊断工作组推进。

诊断报告功能使你可以按需或在某些事件发生时生成报告。该报告包含有助于诊断生产中的问题的信息,包括崩溃、性能降低、内存泄漏、CPU 使用率高、意外错误等。有关诊断报告功能的更多信息,请参阅 https://medium.com/the-node-js-collection/easily-identify-problems-in-node-js-applications-with-diagnostic-report-dc82370d8029。作为一项稳定的功能,启用诊断报告所需的命令行选项将会少一些,并且用户应该更容易在生产环境中启用诊断报告。

V8 升级到 V8 8.1

与往常一样,新版本的 V8 JavaScript 引擎带来了性能调整和改进,并使 Node.js 与语言和运行时方面的不断改进保持了一致。而且 V8 的版本 8(“V8 of V8”)的命名还带来了一些乐趣。

Highlights of the new JavaScript features include:

新的 JavaScript 功能的重点包括:

  • 可选链 — MDN
  • Nullish 合并—MDN
  • Intl.DisplayNamesMDN
  • Intl.DateTimeFormat 启用 calendarnumberingSystem 选项—MDN

有关 V8 中新功能的更多信息,请查看 Node.js V8 博客:https://v8.dev/blog.

实验性异步本地存储API

该项目一直在致力于帮助管理多个版本之间的异步调用上下文的 API。实验性 Async Hooks API 在较早的版本中进行了介绍。Async Hook 的关键用例之一是异步本地存储(也称为连续本地存储)。已经有许多 npm 模块提供了能够满足这种需求的 API ,但是多年来,这些模块很难在 Node.js 内核之外进行维护;并且该项目已经达成了共识,即让 Node.js 提供 API 会更合理。 14.x 版本带来了实验性的 Async Local storage API(也已反向移植到了 13.10)https://nodejs.org/api/async_hooks.html#async_hooks_class_asynclocalstorage。我们正在寻找可以试用此 API 的社区,并向我们提供有关抽象模型、API接口、用例覆盖范围、功能稳定性、命名、文档等方面的反馈,以便我们可以在以后的版本中将其脱离实验性。提供反馈的最佳方法是在此处(https://github.com/nodejs/diagnostics/issues)的提出打开一个问题,并使其标题名为“Experience report with AsyncLocalStorage API”。

此版本包含一些在 Node.js Streams 实现中标记为 SemVer major 的更改。这些更改旨在提高 Streams API 的一致性,以消除歧义并简化 Node.js 核心各个部分的行为。例如,http.OutgoingMessagestream.Writablenet.Socket 的行为完全相同于 stream.Duplex。一个显著的变化是 autoDestroy 选项现在默认设置为 true,使流在结束后始终调用 _destroy。尽管我们不认为这些 SemVer 的重大更改会影响大多数程序,因为它们只会更改边缘情况,但是如果你严重依赖 Stream,最好在 Node.js 14 是当前版本时进行测试,以便为未来的发布做好准备。 Node.js 14 将会在 2020 年 10 月成为 LTS。

实验性 Web Assembly 系统接口

用 Web Assembly 编写的 Node.js 包为某些用例带来了更好的性能和跨平台支持的机会。 14.x 版本包含 Web 程序集系统接口(WASI)的实验性实现,以帮助支持这些用例。尽管对 Node.js v14 来说并不是新事物,但这是值得注意的,因为 WASI 有潜力显著简化本机模块的体验。你可以在 API 文档中了解有关它的更多信息:https://nodejs.org/api/wasi.html。

移除实验模块警告

在 Node.js 13 中,我们不再需要包含 - experimental-modules 标志,但是在 Node.js 中运行 EcmaScript Modules 仍然会产生警告 ExperimentalWarning: The ESM module loader is experimental

从 Node.js 14 开始,在 Node.js 中使用 ESM 时不再出现此警告。但是 Node.js 中的 ESM 实现仍处于试验阶段。根据我们的稳定性指数:“该功能不受语义版本控制规则的约束。向后兼容的更改或删除可能会在将来的任何版本中发生。”在生产环境中使用该功能时,用户应保持谨慎。

请记住,Node.js 中 ESM 的实现不同于你熟悉的开发经验。大多数转换工作流都支持 Node.js ESM 实现不支持的功能,例如可选文件扩展名或 JSON 模块。来自转译环境的模块很可能需要一定程度的重构才能在 Node.js 中工作。值得一提的是,我们的许多设计决策都是有两个主要目标的。规范合规性和 Web 兼容性。我们相信,当前的实现为编写 ESM 模块提供了未来的证明模型,该模块为走向通用 JavaScript 铺平了道路。请在文档中阅读更多内容。

Node.js 中的 ESM 实现仍处于试验阶段,但我们相信,我们已经非常接近能够在 Node.js 中把 ESM 称为“稳定”状态。消除警告是朝这个方向迈出的重要一步。

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

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

此版本在 macOS 上不会对旧版本的 macOS Node.js 用户产生负面影响。对于Node.js 14,我们将最低的 macOS 目标版本提高到了 macOS 10.13(High Sierra)。

在基于 Linux 的平台上,对于 Node.js 14,最低 GCC 版本仍为 GCC 6,但是我们计划为某些使用 GCC 8 的平台构建并发布二进制文件。

Node.js 14 也不会在寿命终止的 Windows 发行版上运行。

有关更多详细信息,请参见 Node.js BUILDING.md

呼吁行动

在进入 “current” 阶段的 6 个月中,Node.js 14 将获得为 Node.js 贡献的最新功能。在接下来的6个月中,此发行版本非常适合尝试最新功能、测试项目与最新 Node.js 更新的兼容性,并提供反馈,因此该发行版准备在 10 月过渡到 LTS。

要下载,请访问:https://nodejs.org/en/download/current/

谢谢!

我们想借此机会对所有促成此版本发布的贡献者和 Node.js 合作者表示非常感谢。我们还要感谢 Node.js 构建工作组 确保我们拥有创建和测试发行版的基础架构,并对 Node.js 14 的工具链进行必要的升级。

Node.js v14.0.0 的发布者是Bethany Griggs。你可以在 v14.0.0 release(https://github.com/nodejs/node/blob/master/doc/changelogs/CHANGELOG_V14.md)中查看完整的功能列表。