【问题标题】:Are there any compatiblity issues with using CJS and ESM modules?使用 CJS 和 ESM 模块是否存在兼容性问题?
【发布时间】:2021-06-24 11:35:30
【问题描述】:

我最近阅读了几篇“NodeJS 中的 ESM” 文章,因此;我决定将我拥有的 CJS 模块转换为 ES-Module (2020)。甚至在我开始编写代码之前,我就注意到了一些令人不知所措的事情——尽管这并不完全出乎意料——我的页面是一个大红色波浪形错误。我发现重写整个模块更容易,尽管我花了几天时间。

所以现在我不禁想知道 ESM 是否必要。更简单地说:如果我今天不开始使用 ESM 模块,我是否会遇到可比性问题,还是可以继续使用 CJS?

【问题讨论】:

  • 我很难说出这个问题。我正在尝试确定我几天前开始的模块是否值得,因为 ES-Module 是值得的。我不得不放弃一些小但值得注意的事情。我确实喜欢 Import 导出语句,但我不禁觉得将模块开发为通用 JavaScript 模块或 ES 模块可能有更重要的原因,兼容性和支持是我最关心的问题。
  • 所有新项目都应该写成 ESM 模块,因为这是语言和 nodejs 的现在和未来。 CJS 模块在很长一段时间内失去支持的可能性极低,因为 nodejs 生态系统的很大一部分仍然是 CJS 模块,我相当怀疑 nodejs 领导层是否想要创造 Python 在 2.0 中所做的那种情况 = > 3.0 这在开发者社区中并不令人愉快。另外,nodejs 中的双重兼容性已经存在,现在并没有真正伤害任何东西。
  • 有一些 CJS 便利,如 __dirname,在 EJS 中不那么便利。而且,EJS 需要静态导出声明(不能像在 CJS 中那样计算它们),这对打包器来说是个好消息,但排除了一些可能进行动态导出的情况。
  • @jfriend00 是的,这是我考虑不切换的重要原因之一。我知道 __dirname 有一个解决方法,但我真的很喜欢 __dirname 原样,没有添加逻辑或路径格式。这是一件小事,但却是极其根本的。在这一点上,我有种感觉,如果 CJS 模块不在逐步淘汰的计划中,并且它们将与一切和谐地工作,我还不如坚持下去。我的意思是为什么要改变?
  • @jfriend00 哦,好吧,我倒读了你的 cmets。所以推进计划是让 ESM 成为标准?

标签: javascript node.js node-modules es6-modules


【解决方案1】:

所有新项目都应该编写为 ESM 模块,因为这是 Javascript 语言和 nodejs 的现在和未来。 CJS 模块在很长一段时间内失去支持的可能性极低,因为 nodejs 生态系统的很大一部分仍然是 CJS 模块,我相当怀疑 nodejs 领导层是否想要创造 Python 在 2.0 中所做的那种情况 = > 3.0 这在开发者社区中并不令人愉快。另外,nodejs 中的双重兼容性已经存在,现在并没有真正损害任何东西。

有一些 CJS 便利,例如 __dirname,在 EJS 中不那么便利。而且,EJS 需要静态导出声明(不能像在 CJS 中那样计算它们),这对打包器来说是个好消息,但排除了一些可能进行动态导出的情况。

ESM Javascript 中的模块标准。 Nodejs 正朝着完全支持该标准的方向发展。新代码应编写为 ESM 模块。我希望未来的一些新功能只能在 ESM 模块中使用,因为这是开发和创新的地方。

CJS 是特定于节点的,而不是 Javascript 标准。 nodejs 背后的开发人员从现有的 3rd 方模块系统中汲取灵感,将它们塑造成适合 nodejs 的需求,并将它们构建到 nodejs 的第一个版本中。它们不是 Javascript 标准。 ESM 现在是 Javascript 标准的一部分,nodejs 一直在采用这个新标准,并在他们需要比标准提供的更多的地方填补了一些内容。

【讨论】:

  • 感谢您的回答,因为它可以让我将问题标记为已回答 - 更重要的是,我感谢您抽出时间与我交谈,因此,我有一个更好的了解 ESM 和 CJS 模块是什么。
猜你喜欢
  • 1970-01-01
  • 2015-05-05
  • 1970-01-01
  • 2022-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-18
  • 2021-11-23
相关资源
最近更新 更多