私は最近ES6モジュールを読んでテストしており、2alityとMDNを私の理解の源泉として使用しています。JavaScriptモジュール(ES6)のサイクリック依存関係
近代化を計画している大規模なレガシーJSウェブアプリケーションでは、循環依存性があり、問題の解決方法はありませんでした。 循環依存関係はできるだけ避けるべきであり、移行後の私の次のステップはできるだけ多くの問題を解決することを知っています。次のように
私のテストケースは次のとおりです。
test.htmlという:
<script type="module">
import B from './B.js';
console.log(B.moo());
</script>
B.js:
// B.js
import A from './A.js';
export default class B {
static moo() {
return A.boo();
}
}
A.js:
// A.js
import B from './B.js';
export default class A extends B {
static boo() {
return "Boo";
}
}
から上記、私は本質的にハ起こってわずか2物事まし:私はそれを得る Uncaught ReferenceError: B is not defined at A.js:3
:
B.moo()
は、しかしエラーで上記のコードの結果をB
を拡張A.boo()
A
静的メソッドを呼び出しますES6モジュールは静的に解決され、エラーは理にかなっています。しかし、彼らはまた(と思われますか?)循環依存をサポートしています。 多くの問題を抱えた後、私は解決策を見つけました。しかし、もっと良い方法があるのだろうか?ここで
は、これまでのところ、私の実用的なソリューションです:test.htmlという:
<script type="module">
import A from './A.js';
import B from './B.js';
console.log(B.moo());
</script>
B.js:
import A from './A.js';
export const B = class B {
static moo() {
return A.boo();
}
}
export {B as default};
A.js:
import B from './B.js';
export const A = class A extends B {
static boo() {
return "Boo";
}
}
export {A as default};
「import A」を「./A.js';*」からb.jsの最後の行に移動できませんでしたか? –
@Jonaswそれは確かに私が思い付くよりもきれいです - しかし、私はそれが働いて驚いています、私は読み込んだと思ったが、インポートされたモジュールの順序は問題ではなかった。私はまだtest.htmlにAとBの両方をインポートする必要があります。これは避けたいものです。 – Jarym
"もっと良い方法があるのだろうか?" - 確かに、あなたのデザインを修正してください。基本クラスは決してその子孫を呼び出すべきではありません。あなたの特定の問題について教えてください。 – georg