如何判断一个特定模块是 CommonJS 模块还是 ES6 模块?

Posted

技术标签:

【中文标题】如何判断一个特定模块是 CommonJS 模块还是 ES6 模块?【英文标题】:How can I tell if a particular module is a CommonJS module or an ES6 module? 【发布时间】:2019-11-19 11:54:43 【问题描述】:

我有一个 Azure 函数(它使用 NodeJS),我试图从中使用另一个团队发布的 npm 模块。在 npm 添加有问题的模块后,我尝试像这样使用它:

import * as Model from "@thing/app-model";
...
const appModel: Model.TheModel = new Model.TheModel([]);

但是,当我尝试运行 Azure 函数时,我收到此错误:

[error] Worker was unable to load function pump: 'SyntaxError: Unexpected token export'

我可以在网上找到的与该错误消息相关的结果表明,此错误通常表明我正在尝试使用 ES6 模块,这是 Node 不支持的(相反我应该使用 CommonJS 模块)。挑战在于我认为该模块是一个 CommonJS 模块。生成模块的项目的 tsconfig.json 在 compilerOptions 中有这一行:

"module": "commonjs"

为了验证或排除 ES6 与 CommonJS 的问题,如果我在 Azure Function 的 node_modules 目录中查看导入的模块,有没有办法通过查看它来判断它是 ES6 模块还是 CommonJS 模块?

谢谢!

【问题讨论】:

查看相关问题 ***.com/questions/42708484/…,以及链接到此处的博客文章 (medium.com/webpack/…),以及现已删除的文档 github.com/nodejs/node-eps/blob/…,看看这是否对您有帮助。我没有时间提炼出正确的答案,而且只有链接的答案是不可接受的,所以我现在只能指出你的意思。 【参考方案1】:

您正在导入的存储库中的编译器配置不会告诉您在安装软件包时下载了哪些代码。从导入的包中打开 package.json 并检查 main 属性指向的内容。接下来打开该文件,您将看到您实际收到的代码。由包的发布决定将代码转换成作者希望包的用户可以使用的任何格式。

【讨论】:

【参考方案2】:

在你的 node_modules 文件夹中找到 npm 包,然后打开 package.json

该软件包可能支持 CommonJs 和/或 ES6,因此您可以组合使用。

您应该会看到如下内容:

  "main": "dist/index.js",
  "module": "dist/my-module.esm.js",

main 通常指向 CommonJs 版本,module 指向 ESM 版本。

这是一般情况,并不总是正确的。有时,结束的文件可以显示它是否支持两者,例如index.cjs.js, index.esm.js

【讨论】:

以上是关于如何判断一个特定模块是 CommonJS 模块还是 ES6 模块?的主要内容,如果未能解决你的问题,请参考以下文章

模块化理解 CommonJS AMD CMD ES6模块

一览js模块化:从CommonJS到ES6

前端模块化方案:CommonJS/AMD/CMD/ES6规范

读懂CommonJS的模块加载

前端模块化:CommonJS,AMD,CMD,ES6

commonjs 与 ES6 模块化