Webpack + babelを使用しています。次の3つのモジュールがあります。
// 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
を取得するのでしょうか?どうしましたか?
問題の絞り込み(別名、髪の毛を引っ張る)のほぼ1日の仕事の後、私は最終的に、循環依存関係にあることに気付きました。
// some other imports here
、A
は別のモジュールC
をインポートし、次にB
をインポートします。 A
はmain.js
で最初にインポートされるため、B
は「円」の最後のリンクになり、Webpack(またはCommonJSに似た環境、たとえばノード)は、A
のmodule.exports
を返すことでそれを短絡させますが、これはまだundefined
です。最終的にはsome-const
と等しくなりますが、B
の同期コードは最終的にundefined
を処理します。
C
がB
の外に依存するコードを削除することにより、循環依存関係を排除することで問題を解決しました。 Webpackがこれについて何らかの形で警告してくれることを願っています。
編集:最後のメモで、@ cookieで指摘したように、 循環依存関係検出用のプラグインがあります dこの問題にぶつからないようにしたい[もう一度]。