使用 webpack 返回空对象的循环导入
circular imports with webpack returning empty object
目前遇到这个确切的问题:
FileA:
var b = require file B
var c = require file C
FileB:
var a = require file A
FileC:
var a = require file A
当我 运行 代码时,文件 C 中出现错误:
A.doSomething is not a function
在那里扔了一个调试器,发现 A 是一个空对象。 真正 奇怪的是我只在文件 C 中遇到错误,而在文件 B 中却没有。这里超级混乱。
这不是 webpack 问题,而是 属性 CommonJS 模块的问题。
当第一次需要 CommonJS 模块时,它的 exports
属性 在后台被初始化为一个空对象。
module.exports = {};
模块然后可以决定扩展此 exports
属性 或覆盖它。
exports.namedExport = function() { /* ... */ }; // extends
module.exports = { namedExport: function() { /* ... */ } }; // overrides
所以当A
需要B
并且B
需要A
之后,A
不会再次执行(这会产生无限循环) , 但它的当前 exports
属性 被返回。由于 A
在文件的最顶部需要 B
,因此在导出任何内容之前,B
模块中的 require('A')
调用将生成一个空对象。
循环依赖的一个常见修复方法是将导入放在文件末尾,在导出其他模块所需的变量后。
A
:
module.exports = { foo: 'bar' };
require('B'); // at this point A.exports is not empty anymore
B
:
var A = require('A');
A.foo === 'bar';
目前遇到这个确切的问题:
FileA:
var b = require file B
var c = require file C
FileB:
var a = require file A
FileC:
var a = require file A
当我 运行 代码时,文件 C 中出现错误:
A.doSomething is not a function
在那里扔了一个调试器,发现 A 是一个空对象。 真正 奇怪的是我只在文件 C 中遇到错误,而在文件 B 中却没有。这里超级混乱。
这不是 webpack 问题,而是 属性 CommonJS 模块的问题。
当第一次需要 CommonJS 模块时,它的 exports
属性 在后台被初始化为一个空对象。
module.exports = {};
模块然后可以决定扩展此 exports
属性 或覆盖它。
exports.namedExport = function() { /* ... */ }; // extends
module.exports = { namedExport: function() { /* ... */ } }; // overrides
所以当A
需要B
并且B
需要A
之后,A
不会再次执行(这会产生无限循环) , 但它的当前 exports
属性 被返回。由于 A
在文件的最顶部需要 B
,因此在导出任何内容之前,B
模块中的 require('A')
调用将生成一个空对象。
循环依赖的一个常见修复方法是将导入放在文件末尾,在导出其他模块所需的变量后。
A
:
module.exports = { foo: 'bar' };
require('B'); // at this point A.exports is not empty anymore
B
:
var A = require('A');
A.foo === 'bar';