Node.js 23 正式发布了,这次更新带来了许多令人激动的改进和新功能。在此版本中,Node.js 23 取代了 Node.js 22,成为 “Current” 版本,后者将于本月晚些时候进入长期支持 (LTS) 阶段。
默认支持 require(esm)
Node.js 23 最大的更新之一是现在可以默认使用 require() 引入原生的 ES 模块。在之前的版本(如 v20.x 和 v22.x)中,我们需要使用 --experimental-require-module 标志来开启这个功能,但在 v23.x 中,这个功能已经默认启用了。尽管如此,它仍处于实验阶段,我们期待用户反馈以便在完全稳定之前做出更多的微调。
CommonJS 和 ES Module 终于要互相兼容了???
当 Node.js 首次通过 require() 加载原生 ES 模块时,会发出实验性警告。如果由于这一功能导致任何回归问题,用户可以在 Node.js 的问题跟踪器中报告。同时,用户可以通过 --no-experimental-require-module 标志禁用这一功能作为临时解决方案。我们计划在 v23.x 版本中测试这一功能,找出潜在的问题并加以调整,然后在 LTS 推广结束后的 semver-minor 版本中,将这一功能无标志地回移到 v22.x。
启用 require(esm) 后,Node.js 不再会因为用 require() 加载 ES 模块而抛出 ERR_REQUIRE_ESM 错误。然而,如果加载的 ES 模块或其依赖项包含顶层 await,则可能会抛出 ERR_REQUIRE_ASYNC_MODULE 错误。一旦 require() 成功加载 ES 模块,返回的对象将是类似于 import() 返回的 ES 模块命名空间对象,可以使用 util.isModuleNamespaceObject() 检查。
用户可以通过 process.features.require_module 查看当前 Node.js 实例是否启用了 require(esm)。对于包开发者,可以使用 “module-sync” 导出条件来检测当前 Node.js 实例中的 require(esm) 支持,并允许 require() 和 import 同时加载相同的原生 ES 模块。关于这一功能的更多详细信息,请查阅官方文档。
放弃 Windows 32 位系统支持
从 Node.js 23 开始,不再支持 32 位的 Windows 系统。这一变化将帮助开发团队关注现代、广泛使用的平台,并简化持续开发。如果你仍在使用 32 位系统,需要停留在旧版本的 Node.js 或升级环境以继续获得更新。
稳定版 node --run 命令
node --run 命令现在已经稳定,可以直接从命令行运行 package.json 中的 "scripts" 对象里的指定命令。如果没有提供命令,它会列出可用的脚本。
--run 会向上遍历到根目录,找到 package.json 文件以运行命令。它会为当前目录的每个父目录将 ./node_modules/.bin 预先加入到 PATH 中,以执行来自不同文件夹(多个 node_modules 目录)的二进制文件(如果父目录中的 node_modules/.bin 是一个目录)。
命令在包含相关 package.json 的目录中执行。例如,以下命令将运行当前文件夹中 package.json 的 test 脚本:
$ node --run test
你还可以向命令传递参数。任何在 -- 之后的参数都会附加到脚本中:
$ node --run test -- --verbose
node --run 并非旨在匹配 npm run 或其他包管理器的运行命令行为。Node.js 的实现故意更加有限,以便专注于最常见用例的高性能。一些被故意排除的功能包括:
1.运行指定脚本之外的预先或后续脚本。
2.定义特定于包管理器的环境变量。
使用 --run 运行脚本时,会设置以下环境变量:
NODE_RUN_SCRIPT_NAME: 被运行脚本的名称。例如,如果使用 --run 运行 test,则该变量的值将是 test。
NODE_RUN_PACKAGE_JSON_PATH: 被处理的 package.json 的路径。
增强的测试运行器
内置的测试运行器在 Node.js 23 中得到了更新。现在可以在指定覆盖文件时使用 glob 模式,使得包含或排除特定文件变得更加容易。对于有多个测试套件的大型项目而言,这尤其有帮助,不再需要手动列出每个文件。
实验性 TypeScript 支持
对于 TypeScript 开发者来说,Node.js 23 带来了新的 --experimental-strip-types 和 --experimental-transform-types 选项。这些实验性标志允许你直接在 Node.js 中运行 TypeScript,减少了处理 TypeScript 代码所需的步骤。尽管还处于早期阶段,但对于正在尝试 TypeScript 的开发者来说,这些选项大大简化了工作流程。
实验性 Web 存储 API
另一个很酷的新增功能是 localStorage 和 sessionStorage API 的实验性实现。这些是 Web 开发者熟悉的工具,现在也可以在 Node.js 中使用了。这使得客户端和服务器环境中使用相同的存储方法变得更容易,为项目带来更多一致性。
实验性 SQLite 集成
Node.js 23 还引入了与 SQLite 一起工作的实验性 API。对于需要简单、轻量级数据库解决方案的开发者来说,这非常适合,没有全套数据库的开销。特别适用于小型项目、原型设计或其他适合使用 SQLite 的应用。
性能提升
在性能方面,Node.js 23 也有许多改进。现在提供了磁盘代码缓存,这有助于减少启动时间。你还会注意到缓存和文件系统性能的提升,使得许多常见操作变得更快,整体运行时更高效。
参考
https://nodejs.org/en/blog/release/v23.0.0