循环依赖什么时候成为问题?
When does circular dependency become a problem?
我在我正在开发的 TypeScript 应用程序上尝试了 madge
:
npx madge --circular --extensions ts src/
并得到一长串循环依赖项(实际上有 61 个)。然而,问题是应用程序可以编译并运行良好。这怎么可能?是否存在某些条件会导致循环依赖成为问题?
同步循环导入没问题,一般。将它们视为声明,它们实际上不执行任何操作。只要您不使用 立即同步导入。例如,这有效:
A.js:
import B from 'B.js'
export function A() {
if (/* some condition that doesn't last forever */) return B()
else return 0 // of course, you don't want an infinite recursive loop either ;)
}
B.js:
import A from 'A.js'
export function B() {
if (/* some condition that doesn't last forever */) return A()
else return 0 // same thing
}
你可以在另一个文件中导入A和B,然后在那里调用它们,就可以了。 A 和 B 相互引用,但它们不需要 使用 直到其中一个被调用。
但是如果您使用两个同步导出之一而另一个尚未导出,则会失败:
A.js:
import B from 'B.js'
export const A = B(something)
B.js:
import A from 'A.js'
export function B() {
return A
}
现在这里发生的是A的评估(必须在导出之前执行)需要调用B,而运行 B要求A已经是定义。
我在我正在开发的 TypeScript 应用程序上尝试了 madge
:
npx madge --circular --extensions ts src/
并得到一长串循环依赖项(实际上有 61 个)。然而,问题是应用程序可以编译并运行良好。这怎么可能?是否存在某些条件会导致循环依赖成为问题?
同步循环导入没问题,一般。将它们视为声明,它们实际上不执行任何操作。只要您不使用 立即同步导入。例如,这有效:
A.js:
import B from 'B.js'
export function A() {
if (/* some condition that doesn't last forever */) return B()
else return 0 // of course, you don't want an infinite recursive loop either ;)
}
B.js:
import A from 'A.js'
export function B() {
if (/* some condition that doesn't last forever */) return A()
else return 0 // same thing
}
你可以在另一个文件中导入A和B,然后在那里调用它们,就可以了。 A 和 B 相互引用,但它们不需要 使用 直到其中一个被调用。
但是如果您使用两个同步导出之一而另一个尚未导出,则会失败:
A.js:
import B from 'B.js'
export const A = B(something)
B.js:
import A from 'A.js'
export function B() {
return A
}
现在这里发生的是A的评估(必须在导出之前执行)需要调用B,而运行 B要求A已经是定义。