我在Babel环境下遇到了ES6的问题:
// A.js
class A {
}
export default new A();
// B.js
import C from './C';
class B {
}
export default new B();
// C.js
import A from './A';
import B from './B';
class C {
constructor(A, B){
this.A = A;
this.B = B; // undefined
}
}
export default new C(A, B)
我这样导入它们:
// stores/index.js
import A from './A';
import B from './B';
import C from './C';
export {
A,
B,
C
}
而从我的应用程序入口点开始,我执行以下操作:
import * as stores from './stores';
我本希望执行顺序是A->B->C,但实际上它是A->C->B。
这是因为模块B导入了C,因此在B模块之前评估了C模块。这在设置C时会创建问题,因为在那种情况下B将是未定义的。
我看到了类似的问题,但我不确定init函数是否是最佳解决方案,它似乎有点hacky。 问: 在ES6中解决这种循环依赖的最佳实践是什么,可能适用于不同的环境(Babel、Rollup)?
new C()
中的A
和B
是未定义的,因为您没有向构造函数传递任何参数,而不是因为导入未起作用。 - Bergiclass
、new
和原型继承。或者更好的方法是使用多个命名导出。那些class
实例甚至不是真正的单例模式,它们可以被重新实例化。如果你想要这样做,最好明确地导出类本身 - 并在你的测试、主应用程序脚本等中实例化它。 - Bergi