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

Javascript 使用CJS和ESM模块是否存在兼容性问题?,javascript,node.js,node-modules,es6-modules,esm,Javascript,Node.js,Node Modules,Es6 Modules,Esm,因此,我今天读了一大堆关于通用JS模块的文章。我发现其中一篇比较透彻的文章是这家伙 在同一项目中使用时,CJS和ESM模块似乎都可以互操作。因此,我想知道的是,除了ESM模块仅在node中实现,而在nodenode3.0时所做的那种情况,这在开发者社区中并不令人愉快。另外,nodejs中的双重兼容性已经存在,并且目前还没有真正损害任何东西 有一些CJS的便利性,如\uu dirname,在EJS中并不方便。而且,EJS需要静态导出声明(它们不能像在CJS中那样进行计算),这对绑定器来说是个好消

因此,我今天读了一大堆关于
通用JS模块的文章。我发现其中一篇比较透彻的文章是这家伙


在同一项目中使用时,CJS和ESM模块似乎都可以互操作。因此,我想知道的是,除了ESM模块仅在node中实现,而在node
node<15.3
版本中启动时命令行中没有使用特殊标志之外,使用node.js v15.3或更新版本的ESM或CJS模块是否存在任何兼容性问题。兼容性是人们在使用NoDE.JS RTE VX3或更新模块构建模块时考虑的因素吗?我想知道的一件事是,CJS模块是否会在不久的将来随时失去支持,或者我是否可以使用其中任何一个模块而不必做那么多关于兼容性的工作?

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


有一些CJS的便利性,如
\uu dirname
,在EJS中并不方便。而且,EJS需要静态导出声明(它们不能像在CJS中那样进行计算),这对绑定器来说是个好消息,但排除了某些可能需要进行动态导出的情况

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


CJS是特定于节点的,不是Javascript标准。nodejs背后的开发人员从现有的第三方模块系统中获取了一些想法,将它们塑造成适合nodejs需求的模型,并将其构建到nodejs的第一个版本中。它们不是Javascript标准。ESM现在是Javascript标准的一部分,nodejs已经采用了这一新标准,并在需要比标准提供更多内容的地方补充了一些内容。

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