【发布时间】:2018-03-17 07:53:09
【问题描述】:
我在 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,因此 C 模块在 B 模块之前被评估。这会在 C 的设置中产生问题,因为在这种情况下 B 将是 undefined。
我见过类似的question,但我不确定 init 函数是不是这里的最佳解决方案,它似乎有点 hacky。
问:解决 ES6 中这种可能在不同环境(Babel、Rollup)中工作的循环依赖的最佳实践是什么?
【问题讨论】:
-
预计执行顺序是 A -> B ->C - 哪个入口点?为什么 C 甚至不使用都导入到 B 中?
-
它被使用,这是一个缺少实现细节的例子。我已经更新了添加入口点的问题
-
省略的细节改变了这里的一切。不会有循环依赖,因为跳过了未使用的导入。考虑提供 stackoverflow.com/help/mcve 。仅对单例使用类也是反模式。
-
A和new C()中的B未定义,因为您没有向构造函数传递任何参数,而不是因为导入不起作用。 -
从不导出类的实例。如果你想要单例模块,不要使用
class语法。
标签: javascript module ecmascript-6 circular-dependency es6-modules