Node.js 23发布

主要功能与增强

Node.js 23 现已发布,带来了新功能、性能提升和更好的开发体验。该版本提升了兼容性和稳定性,为构建高效应用程序提供了更多工具。

此外,Node.js 22 将于10月29日那周升级为长期支持版本 (LTS),进入长期维护阶段,以确保稳定和安全的更新。

Node.js 23 的亮点包括:

  • 使用 require() 加载原生 ES 模块的支持:在 v23.0.0 之前,这项功能需通过 --experimental-require-module 启用。
  • 停止支持 32 位 Windows 系统:Node.js 23 不再支持 32 位 Windows,专注于现代环境。
  • 稳定的 --run 命令:--run 标志已稳定,用于更高效的脚本执行。
  • 测试运行器增强:测试运行器现在支持对覆盖文件使用 glob 模式,提高了测试配置的灵活性。

    require(esm) 现在默认启用

    在 v20.x 和 v22.x 中,通过命令行标志 --experimental-require-module 可以加载原生 ES 模块。在 v23.x 中,这一功能现已默认启用。该功能仍处于实验阶段,我们正在收集用户反馈,以便在完全稳定之前进行更多的调整。为此,在 v23.x 中,当 Node.js 实例首次通过 require() 加载原生 ES 模块时,将会发出实验性警告。

如果此功能导致任何回归问题,用户可以在 Node.js 的问题追踪器上报告。同时,作为解决方法,可以使用 --no-experimental-require-module 来禁用该功能。我们预计会在 v23.x 中测试该功能,查找潜在的回归问题并进行相应调整,然后在 Node.js 22.x 的 LTS 提升后的后续 semver-minor 版本中回溯该功能的解锁。

启用此功能后,Node.js 不会再抛出 ERR_REQUIRE_ESM 错误,即使 require() 被用于加载 ES 模块。不过,如果加载的 ES 模块或其依赖项包含顶级 await,可能会抛出 ERR_REQUIRE_ASYNC_MODULE 错误。当 require() 成功加载 ES 模块时,返回的对象将是一个 ES 模块命名空间对象,类似于 import() 返回的对象,可通过 util.isModuleNamespaceObject() 进行检查。

用户可以通过 process.features.require_module 检查当前 Node.js 实例中是否启用了 require(esm)。对于包,”module-sync” 导出条件可以作为检测当前 Node.js 实例中 require(esm) 支持的方式,允许同时使用 require()import 来加载相同的原生 ES 模块。有关此功能的更多详情,请参阅文档。