使用 CJS 和 ESM 模块是否存在任何兼容性问题?

问题描述

我最近阅读了几篇“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 一直在采用该新标准,并在他们需要比标准提供的更多的地方填充一些位。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...