开源技术 * IBM 微讲堂:Kubeflow 系列(观看回放 | 下载讲义) 了解详情

IBM Developer 博客

通过 IBM Developer 关注最新动态并获取信息

阅读最新的 Node.js 15 发布信息,了解 Node.js 14 升级到 LTS 的意义


Node.js 社区已经发布了 Node.js 15,其中包含对 Node.js 用户和客户非常重要的新功能。虽然不会升级到长期支持 (LTS) 版本,但是我们仍需要客户和更大的生态系统来试用此版本并提供反馈意见,以帮助为 Node.js 16 版本铺平道路。

15 版本中的部分新功能和正在进行中的工作包括:

  • 更新了拒绝处理
  • npm 7
  • N-API V7
  • Async Local Storage API 的改进
  • V8 8.6

更新了拒绝处理

在 Node.js 的先前版本中,如果存在未处理的拒绝,您将收到一个有关该拒绝的警告和一个不推荐使用的警告。

例如,以下示例:

new Promise((resolve, reject) => {
  reject('error');
});

将出现以下不推荐使用消息:

(node:31727) UnhandledPromiseRejectionWarning: error
(node:31727) UnhandledPromiseRejectionWarning: Unhandled promise rejection.This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch().To terminate the node process on unhandled promise rejection, use the CLI flag `--unhandled-rejections=strict` (see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode).(rejection id: 1)
(node:31727) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated.In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

您可以通过使用 catch 块处理拒绝来避免这些警告消息:

new Promise((resolve, reject) => {
  reject('error');
}).catch((error) => {});

从 Node.js 15 开始,缺省行为已更改为:

node:internal/process/promises:218
          triggerUncaughtException(err, true /* fromPromise */);
          ^

[UnhandledPromiseRejection: This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch().The promise rejected with the reason "error".]{
  code: 'ERR_UNHANDLED_REJECTION'
}

我们进行此更改的目的是,符合社区期望并帮助发现通过其他方式难以找到和调试的问题。它使未处理的拒绝行为与未处理的异常行为一致,在这种情况下,我们发现抛出行为很有帮助。

更改缺省值后,Node.js 允许您用 --unhandled-rejections 标志未处理的拒绝配置缺省行为。如果需要恢复为以前的缺省设置,只需添加以下命令行:--unhandled-rejections=warn 或使用 NODE_OPTIONS 环境变量 export NODE_OPTIONS=--unhandled-rejections=warn

您还可以通过添加 unhandledRejection 侦听器来处理未处理的拒绝:

process.on('unhandledRejection', (reason, promise) => {
  // do something
});

npm 7

npm 7 是一个主要版本,附带了一些新功能,包括工作区和对包锁定文件的改进支持。npm 7 的一项新更改是缺省安装了对等依赖项。(如果您要深入了解原因或如何操作的详细信息,可阅读安装对等依赖项博客文章。

尽管 npm 团队已最大程度地减少了由于切换到自动安装对等依赖项而对现有项目造成的可能中断,但如果遇到问题,可以在安装时使用 --legacy-peer-deps 标志作为一种解决方法,以便恢复到先前行为。您还可以按照 npm 文档中所述在环境或 npm 配置文件中进行设置。

有关 npm 7 版本的更多完整信息,可阅读其发布博客:发布 npm CLI 的 V7.0.0

N-API V7

Node.js 15 使得创建、构建和支持原生模块(也称为“插件”)变得更加容易。IBM 和 Red Hat 是 N-API 的持续贡献者之一,并且 Node 15 附带了 N-API V7,后者提供了使用数组缓冲区的其他方法:

napi_status napi_detach_arraybuffer(napi_env env,
                                    napi_value arraybuffer)

napi_status napi_is_detached_arraybuffer(napi_env env,
                                         napi_value arraybuffer,
                                         bool* result)

值的注意的是,node-addon-api 是使用 N-API 的一种方法,最近每周的下载量超过 200 万次!有关 N-API 的更多信息,查看 API 文档node-addon-api

Async Local Storage API 的改进

在 Node.js 14.x 发布博客中,我强调增添了 Async Local Storage API。我们在 15.x 时间线期间继续优化了此 API,并对其进行了社区测试。目前,该 API 仍处于试验阶段,欢迎试用。

对于需要跨流程事务跟踪和更深入地了解其大型应用程序的企业客户而言,这是一项重要功能。它将确保 Node.js 为使用 OpenTelemetry 等开源解决方案和其他应用程序性能管理解决方案 (APM) 的企业提供受支持的 API 和一流的体验。

Node.js 14.x 成为了下一个 LTS 版本

同样令人兴奋的是,Node.js 14.x 版本升级为 LTS,这样您就可以更轻松地在生产中使用其功能!Node.js 14.x 带来了许多出色的附加功能,我尤其感兴趣的是:

  • 诊断报告作为稳定功能在 14.x 中提供。客户已经在利用易于使用的诊断报告来更快速地解决问题。在最近的一个示例中,客户在报告问题时提供了诊断报告,因此我们能够快速诊断并提供解决方案,而不必浪费时间来获取更多信息。这是一个很好的示例,说明了报告中的摘要级别信息可以如何帮助您更快速地诊断和解决问题。
  • 将会推出一个内置完整 ICU 数据的 LTS 版本,从而简化大规模多语言部署。

IBM 的 Node.js 项目参与战略是专注于我们认为对客户很重要的方面,包括可预测的稳定版本、平台支持、安全性、诊断、性能、代码质量和安全网以及关键功能。作为云原生部署的顶级运行时之一,Node.js 对于 IBM 和 Red Hat 的混合云以及 OpenShift 工作至关重要。

14.X 版本涵盖了许多领域,您可以阅读有关 LTS 版本中目前可使用的所有 14.x 新功能的更多信息:Node.js 14 版本:新的诊断工具、功能和性能增强

感谢我们出色的团队

最后,我要感谢发布团队(包括 Red Hat 负责管理 15.x 的 Bethany Griggs 在内),感谢他们为 Node.js 15 的顺利发布而付出的所有努力。我还想感谢来自编译工作组的大力支持,当然,也要感谢个人贡献者。

如何为 Node.js 做出贡献

提交代码并参与 Node.js 团队工作并不是为 Node.js 的持续成功做出贡献的唯一途径。作为 Node.js 包开发者或最终用户,您最好是提前测试,并经常测试,以便为 Node.js 项目提供帮助和反馈意见。

我们以 6 个月为固定周期(每年的 4 月和 10 月)发布一次主要版本,这样,我们就有充足的时间来提前测试版本,以便在版本升级到 LTS 时不会出现任何意外。我们需要您帮忙进行测试。一旦版本为 LTS,就需要考虑定期在 LTS 版本上测试应用程序和包,以确保要迁移到这些版本的最终用户具有绝佳的体验。如果发现问题,可在 Node.js 存储库中提交问题来进行报告。

如果您是包维护人员,可考虑将您的版本和支持周期与 Node.js 版本线保持一致。本文(维护人员应考虑遵循 Node.js 的发布时间表)由 OpenJS 基金会发表,它充分说明了为什么这样做有益于生态系统。

最近,我们还创建了一个新的 Node.js 分类角色,用于帮助我们管理积压问题。这是开始为项目做出贡献的有效方法。

了解更多信息

如果您要进一步了解此版本,可查看有关 Node.js 15 版本发布的社区博客。您还可以在以下站点上了解有关 IBM 和 Red Hat 的最新信息:

本文翻译自:Node.js 15 release: Updated handling of rejections, npm 7, N-API Version 7, and more(2020-10-20)