循环依赖什么时候成为问题?

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已经是定义。