2016-02-06 8 views
31

webpack + babelを使用しています。私は三つのモジュールはこのように見ていますmain.jsが実行されるとインポート順に応じて、Webpackのインポートが未定義に戻ります

// 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.jsBに輸入を交換した場合

B undefined 
A 
main some-const 

、私が取得:

A 
B some-const 
main some-const 

どのようにB.jsが最初のバージョンのモジュールではなくundefinedになるのですか?どうしましたか?

答えて

86

問題を絞り込んだ(髪を引っ張る)のほぼ完全な勤務日の後、私は最終的に私が循環依存性を持っていることに気がついた。

// some other imports hereと記載されている場合、Aは別のモジュールCをインポートし、次にBをインポートします。 Amain.jsに最初にインポートされるので、Bは "サークル"の最後のリンクになり、Webpack(またはNodeのようなCommonJSのような環境)はAmodule.exportsを返すだけで、まだundefinedです。最終的にはsome-constになりますが、Bの同期コードはundefinedの代わりになります。

円の依存関係を削除するには、CBに依存するコードを移動して問題を解決しました。 Webpackが何とかこれについて私に警告することを願います。

編集:最後に、@ cookieで指摘されているように、there's a plugin for circular dependency detectionさんがこの問題にぶつかるのを避けるためです。

+2

あなたはほとんどの日を救っただけです。同じ問題があった場合、あなたのソリューションは5分で解決しました!ありがとう – boatcoder

+0

私はこの素晴らしい答えのおかげで問題を解決しました。 – egucciar

+9

循環依存関係を検出するwebpack用のプラグインがあります:https://www.npmjs.com/package/circular-dependency-plugin – cookie