RequireJS模块相互引用

azz*_*y81 3 requirejs

我使用requirejs加载一个Web应用程序建设的几个模块,但我正在努力理解一些东西.我的主要模块需要它依赖,但其他定义的模块都以某种方式相互引用.所以我们可以说'project/func'模块可以在'project/save'模块中调用一个save函数.现在我的大部分代码都导致了未定义的错误.

从在线阅读可能我已经打了一个称为循环引用的东西?我不太确定.我想我需要知道我做错了什么以及我应该怎么做.我试过在下面给一个例子,主文件在其中一个模块中调用bootstrap方法但该模块在某个时候调用另一个模块.这只是一个小例子.真正的应用程序有许多模块,如果有意义的话,它们都需要在彼此内部运行功能.

//main require
require(['jquery', 'jqueryui', 'project/save', 'project/funcs', 'project/spec'], function($, ui, proSave, proFunc, proSpec){
    proFunc.bootstrap();     
});

//project/save
define(function(){
    var save = function(){
        //do some save stuff here
    }
    return {
        save: save
    }
});

//project/funcs
define(['project/save'], function(proSave){
    var funcs = {
        bootstrap: function(){
            //do some stuff 
            funcs.func1();
        },
        func1: function(){
        //do some stuff and save
        proSave.save();
    }
    }
    return {
        funcs: funcs
    }
});
Run Code Online (Sandbox Code Playgroud)

Lou*_*uis 5

RequireJS有关于循环依赖关系的文档,解释了如何处理它们:

如果定义循环依赖(需要b和b需要a),那么在这种情况下调用b的模块函数时,它将获得a的未定义值.b可以在使用require()方法定义模块后稍后获取(确保将require指定为依赖项,以便使用正确的上下文查找a):

//Inside b.js:
  define(["require", "a"],
    function(require, a) {
        //"a" in this case will be null if a also asked for b,
        //a circular dependency.
        return function(title) {
            return require("a").doSomething();
        }
    }
  );
Run Code Online (Sandbox Code Playgroud)

因此,您必须编写代码,以便能够处理循环依赖项中的模块定义最初未定义的事实.有关如何完成此操作的详细信息取决于应用程序的特定结构.

从RequireJS文档中,这些智慧的话非常值得关注:

循环依赖很少见,通常是您可能想要重新考虑设计的标志.

[强调补充.]通常情况下,如果模块A依赖于B而B依赖于A,则有一部分功能要从A或B中提取并移入模块C,这将允许A依赖于C而不是B和B依赖于C而不是A,并打破循环依赖.为了每个人都使用这样的代码,这是最好的选择.然后,在极少数情况下无法去除圆形度,我上面引用的文档告诉您如何处理它.