主要观点: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 可在同一文件中使用
import
和require
,但导入使用顶级await
的模块仍有问题,Deno 不支持 CommonJS 无此问题。 - 作为用户应停止使用 CommonJS 或进行测试等,作者认为此功能不应进入稳定版本,会增加 JavaScript 模块的混乱。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。