Oasis's Cloud

一个人的首要责任,就是要有雄心。雄心是一种高尚的激情,它可以采取多种合理的形式。
—— 《一个数学家的辩白》

Nodes.js 22 带来的重大收益

作者:oasis


Node.js 22 放宽了 CommonJS 模块和 ESM 模块的互操作限制。允许在 CommonJS 模块通过 require("esm modules") 导入 ESM 文件。 但是在 esm 文件中存在顶层的 await ,则不允许使用 require() 导入。

这个特性带来的重大意义:大部分 NPM 包可以不用再提供 CommonJS 和 ESM 的产物,只提供 ESM 产物即可。ESM 产物已经被大部分浏览器所支持。 未来工程化可能会越来越简单了。

  • 执行 package.json 中的脚本
    • 功能:新增实验性功能,通过 CLI 标志 noderun -- <script-in-package-json> 执行 package.json 中的脚本。
    • 示例:node --run test 将执行 package.json 中的 test 命令。

TypeScript 5.8 的支持

  • --module nodenext 标志:
    • TypeScript 5.8 引入了 --module nodenext 标志。
    • 当启用该标志时,TypeScript 不会报错,允许 CommonJS 文件通过 require() 导入 ESM 文件。
  • 注意事项:
    • 由于此特性可能被回溯到旧版本的 Node.js,目前没有稳定的 --module nodeXXXX 选项支持此行为。
    • 未来版本的 TypeScript 可能会在 node20 下稳定支持此特性。
  • 建议:
    • 使用 Node.js 22 或更高版本的用户应启用 --module nodenext。
    • 使用旧版本 Node.js 的用户应继续使用 --module node16 或更新到 --module node18。