module.exports 给 undefined 而 print 模块表示它不是 undefined?

module.exports give undefined while print module indicates it's not undefined?

我正在尝试使用 CommonJs 模块,该模块根据 modulemodule.exports 是否未定义有条件地导出变量。我目前遇到的问题是,有时当我使用 import { something } from 'themodule' 时,它会给我未定义的 something。在查看源代码时,我发现了以下导出条件:

if (typeof module !== 'undefined' && module.exports) {
    module.exports = Prism;
}

所以我在文件中添加了一些日志来查看是否满足条件:

console.log('module: ', module, 'module.exports: ', module.exports)
if (typeof module !== 'undefined' && module.exports) {
    console.log('module.exports!')
    module.exports = Prism;
}

然而这给了我奇怪的输出:

module: { exports: [Getter/Setter] } module.exports: undefined

如您所见,module 日志似乎表明它有一个 exports 属性 但是当单独记录 module.exports 时,它说它是未定义的。这怎么可能 ?有人可以帮助理解为什么需要进行此检查以及为什么有时 module.exports 可以未定义吗?谢谢!

这里有一些几乎不相关的问题。

The issue I'm currently having is that sometimes when I use import { something } from 'themodule' it gives me undefined something

如果您的 import 链中存在循环依赖,就会发生这种情况。如果 a.js 从 b.js 导入,并且 b.js 从 c.js 导入,并且 c.js 从 a.js 导入 - 那么,对于代码 运行 在这些模块的 顶层 中,无法保证 other 模块顶层的代码 运行 已被执行。虽然您可以试验并查看发生了什么,但更好的方法是

  • 去掉循环依赖,and/or
  • 在您的代码中只有一个入口点,从该入口点调用所有其他有意义的东西,以便下游的循环依赖性不会导致问题 - 让您的下游出口成为 functions ,没有依赖于其他导入的顶级代码。

Which however gives me strange output:

module: { exports: [Getter/Setter] } module.exports: undefined

这意味着:

  • exports 属性 是 getter/setter
  • 当您调用 getter 时,它显然 return 编辑了 undefined。 属性 存在,但调用 getter 不会 return 任何东西。例如

const obj = {
  get prop() {
  }
};

console.log(obj.hasOwnProperty('prop'));
console.log(obj.prop);


Can someone help understand why this check is needed

检查

if (typeof module !== 'undefined' && module.exports) {

只是检查代码是否在 CommonJS 上下文中执行,如果是,它会将 Prism 分配给导出。