Webpack导入返回undefined,具体取决于导入的顺序

时间:2016-02-06 11:57:50

标签: javascript webpack babeljs

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

void remdup() {
        int *nSet;
        for(int x=0;x<card-1;x++) {
            for(int y=x+1;y<card;y++) {
                if(Set[x]==Set[y]) {
                    for(int g=y;g<card-1;g++) {
                        Set[g]=Set[g+1];
                    } card--;
                }
                }
        }
        nSet=new int[card];
        for( int u=0;u<card;u++) {
            nSet[u]=Set[u];
        }
        delete Set;
        Set=new int[card];
        for(int u=0;u<card;u++) {<---
            Set[u]=nSet[u];
        }

执行// 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而不是第一个版本中的模块?怎么了?

1 个答案:

答案 0 :(得分:143)

经过几乎整整一个工作日缩小问题(AKA拉毛)后,我终于意识到我有一个循环依赖。

如果undefined显示,// some other imports here会导入另一个模块A,而模块C会导入BA首先导入main.js,因此B最终成为&#34;圈&#34;和Webpack(或任何类似CommonJS的环境)中的最后一个链接问题,就像Node一样,只需通过返回A module.exports undefined来使其短路,这仍是some-const。最终,它等于B,但undefined中的同步代码最终会处理C

通过移出B取决于{{1}}的代码,消除了循环依赖关系,解决了这个问题。希望Webpack会以某种方式警告我。

修改:在@cookie there's a plugin for circular dependency detection指出的最后一个注释中,如果您想避免再次遇到此问题。