Webpack导入返回未定义,具体取决于导入顺序


78

我正在使用webpack + babel。我有三个看起来像这样的模块:

// A.js

// some other imports here
console.log('A');
export default 'some-const';

// B.js

import someConst from './A';
console.log('B', someConst);
export default 'something-else';

// main.js

import someConst from './A';
import somethingElse from './B';
console.log('main', someConst);

main.js执行时,我看到以下内容:

B undefined
A
main some-const

如果我将中的导入交换为main.js,则B成为第一个,我得到:

A
B some-const
main some-const

怎么会B.js得到undefined而不是第一个版本中的模块?怎么了?

Answers:


178

在解决问题(拉头发)近一整天的工作后,我终于意识到我有一个循环依赖。

它说的是// some other imports hereA导入另一个模块C,然后依次导入BA首先在得到进口main.js,所以B最终是在“圆”的最后一个环节,和的WebPack(或任何CommonJS的般的环境,对于这个问题,如Node)刚刚短路通过返回Amodule.exports,这仍然是undefined。最终,它等于some-const,但是同步代码B最终undefined代替了。

通过移出C依赖于out的代码,消除了循环依赖关系B,从而解决了该问题。希望Webpack会以某种方式警告我。

编辑:最后一点,如@cookie所指出的,如果您想避免再次遇到此问题,则有一个用于循环依赖项检测的插件


19
有一个用于webpack的插件可以检测循环依赖:npmjs.com/package/circular-dependency-plugin
cookie

4
你是一个令人毛骨悚然的英雄。Webpack就是这样的垃圾箱之火-这只是炸毁了我的vue.js网站。事实证明,如果组件X导入了Vuex状态Y + js模块Z,并且Y和Z都导入了相同的JSON FILE,则某种程度上构成了循环依赖。除非如此,否则永远不会修复它。
Paul Gowder '18年

3
因此...如果webpack因为不支持循环依赖而发出了损坏的代码(我不是在争论它应该支持不良设计),那么我们为什么需要一个告诉我们有问题的插件?
joonas.fi,

2
@ joonas.fi:我同意。IMO和JS生态系统通常归结为jwz.org/doc/worse-is-better.html
johncip

多亏了您,我修复了一个不可能的错误,为您节省了很多时间:-*
Wazime,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.