【问题标题】:When does circular dependency become a problem?循环依赖何时会成为问题?
【发布时间】:2020-11-04 10:06:54
【问题描述】:

我在我正在开发的 TypeScript 应用上尝试了madge

npx madge --circular --extensions ts src/  

并且得到了大量的循环依赖(实际上是 61 个)。然而,问题是应用程序可以编译并且工作正常。这怎么可能?循环依赖变成问题的时候有一定的条件吗?

【问题讨论】:

    标签: javascript typescript es6-modules circular-dependency


    【解决方案1】:

    同步循环导入一般都可以。将它们视为声明,它们实际上并没有执行任何操作。只要您不立即同步地使用导入。例如,这有效:

    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。

    【讨论】:

    • 有没有办法(在madge 或任何其他工具中)只转储同步循环依赖项?
    • 我不知道。循环动态导入肯定会导致错误,因此您应该真正担心它们而不是同步导入(无论如何,后者通常在构建过程中捆绑到一个文件中)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-25
    • 2021-05-08
    相关资源
    最近更新 更多