Javascript Web包返回空对象的循环导入

Javascript Web包返回空对象的循环导入,javascript,node.js,webpack,Javascript,Node.js,Webpack,目前正遇到这个问题: FileA: var b=需要文件b var c=需要文件c 文件B: var a=需要文件a 文件C: var a=需要文件a 运行代码时,文件C中出现错误: A.doSomething不是一个函数 在那里抛出了一个调试器,并看到a是一个空对象。真正的奇怪的是,我只在文件C中得到一个错误,而不是文件B。这里非常混乱。这不是一个网页问题,而是CommonJS模块的一个属性 当第一次需要CommonJS模块时,它的exports属性在幕后初始化为空对象 module.ex

目前正遇到这个问题:

FileA:
var b=需要文件b
var c=需要文件c
文件B:
var a=需要文件a
文件C:
var a=需要文件a
运行代码时,文件C中出现错误:

A.doSomething不是一个函数

在那里抛出了一个调试器,并看到a是一个空对象。真正的奇怪的是,我只在文件C中得到一个错误,而不是文件B。这里非常混乱。

这不是一个网页问题,而是CommonJS模块的一个属性

当第一次需要CommonJS模块时,它的
exports
属性在幕后初始化为空对象

module.exports={};
然后,模块可以决定扩展此
导出
属性,或覆盖它

exports.namedExport=function(){/*…*/};//延伸
module.exports={namedExport:function(){/*…*/}};//覆盖
因此,当
A
requires
B
B
requires
A
紧随其后时,
A
不会再次执行(这将产生一个无限循环),但返回其当前的
exports
属性。由于
A
required
B
位于文件的最顶端,因此在导出任何内容之前,
B
模块中的
require('A')
调用将生成一个空对象

循环依赖项的常见修复方法是在导出其他模块所需的变量后,将导入放在文件末尾

A

module.exports={foo:'bar'};
要求('B');//此时,A.exports不再为空
B

var A=require('A');
A.foo==='bar';

hey you:)谢谢它帮助我理解了这个问题。但如果在A中,您需要访问B导出的某些属性,该怎么办?在我的代码库中,我刚刚用
exports.attribute
替换了
module.exports
,它现在可以工作了,但感觉不是很自然。你可以在B中总是做同样的事情。
module.exports={bar:'foo'};var A=要求('A')
,然后
module.exports={foo:'bar'};var B=要求('B')。如果导出相互依赖,那么您应该通过扩展
导出来逐步构建它们,而不是覆盖它。这是有史以来给出的关于堆栈溢出的最重要答案。你是个英雄,救了我的命。谢谢!我们有这个问题,这个答案解决了这个问题,但当我们建造摩卡咖啡时,它不起作用(我编写了一个工具来检查您的Webpack项目是否存在循环依赖关系: