处理循环依赖
Handling circular dependencies
我相信下面四种方法都可以工作,但我不清楚为什么有人会使用前三种方法,仅仅因为它的代码更多。然而,第一个(也是最冗长的)是在RequireJS文档中给出的。
define "circular1", ["example1"], -> "circular1"
define "circular2", ["example2"], -> "circular2"
define "circular3", ["example3"], -> "circular3"
define "circular4", ["example4"], -> "circular4"
#1
define "example1", ["require", "circular1"], (require, circular) ->
alert "example1 Before: " + circular
circular = require "circular1"
alert "example1 After: " + circular
#2
define "example2", ["require"], (require) ->
alert "example2 Before: " + circular
circular = require "circular2"
alert "example2 After: " + circular
#3
define "example3", ["circular3"], (circular) ->
alert "example3 Before: " + circular
circular = require "circular3"
alert "example3 After: " + circular
#4
define "example4", [], ->
alert "example4 Before: " + circular
circular = require "circular4"
alert "example4 After: " + circular
require ["example1"], ->
require ["example2"], ->
require ["example3"], ->
require ["example4"], ->
- 如果
circularDependency
是未定义的,直到你做显式的require
,麻烦把它包括在定义中的意义是什么(#1 3) ? - 如果
require
总是作为第一个脚本加载全局可用,为什么要传递它?这仅仅是代码清晰度的问题,即,它只是在代码的顶部提供所有依赖关系的简洁快照(因为您可能直到很久以后才真正得到显式require
?或者它是否有一些真正的影响RequireJS如何优化取决于它是否包含在define
?
我不想使用这些变化中的任何一个,如果它对我的软件有负面影响,只是因为它"工作"。"
当RequireJS将每个模块作为一个单独的文件加载,而不是将它们捆绑在一起时,情况就不同了。在依赖项列表中指定该模块会告诉RequireJS,它需要在调用该模块的函数之前加载该模块。由于require
是同步的,它不会尝试同步加载脚本,如果脚本尚未加载,则无法返回模块。由于require
应该解析相对于要求模块的相对模块id,因此您需要使用它传递给您的require
。所以:
第一种方法是正确的。它告诉RequireJS,如果模块还没有被加载,就加载它。如果
circular
最初是undefined
,它可以很快用其他模块填充它。第二种方式是不正确的。如果
circular2
没有加载,对require
的调用将无法工作。它将正确地解析模块ID,因为它使用了给定的require
。第三种方法是正确的在这种情况下,但是如果您传递给它一个相对模块ID,如
./circular3
,它将不工作。如果模块还没有被加载,它也会告诉RequireJS加载模块,这样您就不会遇到#2中的问题。唯一的区别是它使用全局require
,它缺乏传递给工厂函数的require
的上下文,所以如果你传递给它一个像./circular3
这样的相对模块ID,它不知道相对于什么来解析它。这种方法结合了#2和#3的不正确性。首先,它不能正确解析相对模块id。其次,即使它可以正确地解析相对id,它仍然不会加载尚未加载的模块。
如果你能保证circularN
模块总是在exampleN
模块需要它之前定义,那么是的,它将工作,但使用方法#1和#3确保它将工作,即使情况并非如此。
- FRP 中 EventStreams 的循环依赖关系
- GraphQL代码中的Javascript循环依赖关系
- 通过JavaScript构造函数引入循环依赖关系
- RequireJS,循环依赖和导出“魔术”方法
- 使用 requireJs 的模块中的循环依赖关系
- CommonJS singelton模块中的循环依赖关系
- 可观察量相互依赖以获取自己的值 - 循环引用
- 如何避免 Google 闭包库/编译器中的循环依赖错误
- 如何处理 React 嵌套组件循环依赖?(使用 es6 类)
- AngularJS中的循环依赖和OOP问题
- 如何正确解决需求中的循环依赖.js
- 角度相互依赖的服务:避免循环依赖
- 在拦截器中使用“$mdToast”触发循环依赖
- 视图模型内存泄漏 - 摆脱循环依赖
- 复杂的循环节点模块依赖抛出“类型错误:'继承'的超级构造函数必须有一个原型”
- 如何在没有循环依赖的模型之间正确共享Hapi-Joi验证模式
- 如何在Backbone.js中使用嵌套视图解决循环依赖关系
- 我应该如何循环通过依赖于前一个循环的异步函数's值
- 处理循环依赖
- Angularjs模块依赖循环