在同一个项目中混合 CommonJS 和 ES6 模块

Posted

技术标签:

【中文标题】在同一个项目中混合 CommonJS 和 ES6 模块【英文标题】:Mix CommonJS and ES6 modules in same project 【发布时间】:2021-07-18 14:56:16 【问题描述】:

我在 NodeJS 中工作。我有大量遗留代码,包括在许多地方使用的几个包。这段代码都是CommonJS,Node require() 模块结构。

Node 现在支持 ES6。由于它是 javascript 语言功能,我想迁移到它。

今天,我开始了一个小项目。我的小项目样板需要()几个我最喜欢的实用程序,然后说“Hello World”。我对其进行了编辑以导入所述实用程序。 Node 告诉我我需要在 package.json 中添加“type”:“module”,我做到了。

当我运行它时,我被告知“require is not defined”,这是指我导入的实用程序模块之一。

我推断这意味着一个项目要么是 CommonJS 要么是 ES6,而且似乎这两者永远不会相遇。我对此感到惊讶,因为这意味着我将永远在 NodeJS 中使用 ES6,因为我将永远无法更改 所有我 require() 的模块。有些甚至不是我的,有些则用于我什至不知道的项目(npm!)中。

老实说,我很难相信会是这样。我不明白 ES6 是如何成为广泛使用的标准的,因为如果 ES^ 和 CommonJS 不能在应用程序中一起使用。我意识到 Webpack 等会预处理代码并修改所有 require() 语句,但并不是每个人都使用这种实用程序。

我的问题是:

这个分析正确吗?

是否有一些解决方法可以让我同时使用两个模块系统(没有预处理器)?

我即将做出的决定永远不会使用 ES6 是正确的吗?

【问题讨论】:

不同的包应该可以使用不同的模块格式。看看***.com/q/61549406/1048572 pencilflip.medium.com/… 我看不到任何可以正确而清晰地回答这个问题的东西......你有没有找到一种混合和匹配的方法? 【参考方案1】:

在 .cjs 或 .mjs 文件中使用 import( ... )

https://nodejs.org/dist/latest-v14.x/docs/api/esm.html#esm_import_expressions https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/import#dynamic_imports

【讨论】:

虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 - From Review

以上是关于在同一个项目中混合 CommonJS 和 ES6 模块的主要内容,如果未能解决你的问题,请参考以下文章

commonjs 与 ES6 模块化

论AMD,CMD,CommonJs 和 ES6对比

汇总 commonjs

ES6-Module与CommonJs

es6和commonJs的区别

amdcmdCommonJS以及ES6模块化