在未来,使用顶级 await 可能会导致 Node 中的向后兼容性中断

主要观点:Node 23 本周发布,现在可通过require()加载使用 ESM(import/export)的文件,这有助于解决 ESM 和 CommonJS 的差异问题,但存在只能加载未使用顶级await的 ESM 模块的限制,使用顶级await在 Node 23 中是向后兼容的突破,若项目中首次使用顶级await可能构成新的主版本,给出了应对此问题的三种方法,如告知用户不支持require()、添加虚拟await、明确破坏 CommonJS 等,其他运行时如 Bun 和 Deno 情况不同,导入 CommonJS 文件到模块不存在此问题,作为用户应考虑停止使用 CommonJS 等措施,作者认为此功能不应进入稳定的 Node.js 版本,因其增加了 JavaScript 模块的混乱。
关键信息:Node 23 可透明加载 ESM 模块、顶级await的影响、三种应对方法、其他运行时情况、用户应采取的措施
重要细节

  • Node 23 前使用 ESM 需动态导入,返回 Promise 需异步或在函数中使用,很多包会同时提供 CommonJS 和 ESM 版本。
  • Node 23 改变后可直接用require()加载 ESM 模块,但不能加载使用顶级await的模块,否则会报错,且此限制适用于项目及依赖中的所有文件。
  • 三种应对方法:告知用户不支持require()、添加虚拟await、明确破坏 CommonJS。
  • Bun 可在同一文件中使用importrequire,但导入使用顶级await的模块仍有问题,Deno 不支持 CommonJS 无此问题。
  • 作为用户应停止使用 CommonJS 或进行测试等,作者认为此功能不应进入稳定版本,会增加 JavaScript 模块的混乱。
阅读 19
0 条评论