问题描述
我最近阅读了几篇“NodeJS 中的 ESM” 文章,因此;我决定将我拥有的 CJS 模块转换为 ES-Module (2020)。在我开始编写代码之前,我注意到了一些令人难以抗拒的事情——尽管这并非完全出乎意料——我的页面是一个巨大的红色波浪形错误。我发现重写整个模块更容易,即使我花了几天时间。
所以现在我不禁怀疑是否需要 ESM。更简单地说:如果我今天不开始使用 ESM 模块,我会在未来遇到可比性问题,还是可以继续使用 CJS?
解决方法
所有新项目都应编写为 ESM 模块,因为这是 Javascript 语言和 nodejs 的现在和未来。 CJS 模块在很长一段时间内失去支持的可能性非常大,因为 nodejs 生态系统的很大一部分仍然是 CJS 模块,我相当怀疑 nodejs 领导层是否想要创造 Python 2.0 所做的那种情况 = > 3.0 这在开发者社区中并不令人愉快。另外,nodejs 中的双重兼容性已经存在,现在并没有真正损害任何东西。
有一些像 __dirname
这样的 CJS 便利,在 EJS 中没有那么方便。而且,EJS 需要静态导出声明(它们不能像在 CJS 中那样计算),这对打包器来说是个好消息,但排除了某些可能需要进行动态导出的情况。
ESM 是 Javascript 中的模块标准。 Nodejs 正在努力完全支持该标准。新代码应编写为 ESM 模块。我预计未来的一些新功能只会在 ESM 模块中可用,因为这就是开发和创新发生的地方。
CJS 是特定于节点的,而不是 Javascript 标准。 nodejs 背后的开发人员从现有的 3rd 方模块系统中汲取灵感,将它们塑造成适应 nodejs 的需求,并将它们构建到 nodejs 的第一个版本中。它们不是 Javascript 标准。 ESM 现在是 Javascript 标准的一部分,nodejs 一直在采用该新标准,并在他们需要比标准提供的更多的地方填充一些位。