相互引用的RequireJS模块
我使用requirejs加载一个web应用程序Im构建的几个模块,但我很难理解一些东西。我的主模块需要依赖于it,但其他定义的模块都以某种方式相互引用。因此,假设“project/func”模块可以调用“project/save”模块中的save函数。现在我的大部分代码都导致未定义的错误 通过在线阅读,也许我找到了所谓的循环参考??我不太确定。我想我需要知道我做错了什么,我应该怎么做。我试着在下面举一个例子,主文件在其中一个模块中调用bootstrap方法,但该模块在某个时候调用了另一个模块。这只是一个小例子。真正的应用程序有更多的模块,如果有意义的话,它们都需要在彼此内部运行功能相互引用的RequireJS模块,requirejs,Requirejs,我使用requirejs加载一个web应用程序Im构建的几个模块,但我很难理解一些东西。我的主模块需要依赖于it,但其他定义的模块都以某种方式相互引用。因此,假设“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
}
});
RequireJS有一个循环依赖项,解释了如何处理它们:
如果您定义了一个循环依赖项(a需要b,b需要a),那么在这种情况下,当调用b的模块函数时,它将获得a的未定义值。b可以在稍后使用require()方法定义模块后获取a(请确保将require指定为依赖项,以便使用正确的上下文查找a):
因此,您必须编写代码,以便能够处理循环依赖项中的模块定义最初是未定义的这一事实。如何实现这一点的细节取决于应用程序的特定结构
这些来自RequireJS文档的智慧之言非常值得注意:
循环依赖性很少见,通常是一个迹象,表明您可能需要重新考虑设计。
[重点补充]通常,如果模块A依赖于B而B依赖于A,则需要从A或B中提取功能子集,并将其移动到模块C中,从而允许A依赖于C而不是B,B依赖于C而不是A,并打破循环依赖关系。为了所有使用这种代码的人,这是最好的选择。然后,在少数情况下无法删除循环,我上面引用的文档会告诉您如何处理循环。您能指出循环在问题中显示的代码中的位置吗?因为现在我没有看到。也许更好更简单的解释是,我有一个带函数a和B的模块,还有一个带函数C的模块。函数a调用函数C,但C需要调用函数B。YY下面的答案确实有帮助,我要试着看看我从哪里得到答案谢谢!OP可能不接受这个答案,但它确实帮助了我。:-)我刚接触过requirejs/amdjs,不知道如何引用其他模块。然后我找到了你的答案,意识到这和AngularJS的继承方式非常相似。
//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();
}
}
);