Javascript 如何正确解决require.js中的循环依赖关系
我有以下模块配置:Javascript 如何正确解决require.js中的循环依赖关系,javascript,requirejs,amd,Javascript,Requirejs,Amd,我有以下模块配置: 全局->收藏->收藏夹(全局需要收藏,收藏需要收藏夹) 同时,收藏夹还需要全局模块(用于其“其他属性”) 示例代码: define("global", ["collections"], function(Collections) { console.log("Defining global"); var Global = { env: "home", collections: Collections }; r
全局->收藏->收藏夹
(全局需要收藏,收藏需要收藏夹)
同时,收藏夹
还需要全局
模块(用于其“其他属性”)
示例代码:
define("global", ["collections"], function(Collections) {
console.log("Defining global");
var Global = {
env: "home",
collections: Collections
};
return Global;
});
define("collections", ["favorites"], function(Favorites) {
console.log("Defining collections");
var collections = {
likes: function() {},
favorites: Favorites
};
return collections;
});
define("favorites", ["global"], function(Global) {
console.log("Defining favorites");
var Favorites = function(name) {
console.log(Global.env)
this.name = name;
};
return Favorites;
});
require(["global"], function(Global) {
console.log("global", Global);
console.log("collections", Global.collections);
console.log("favorites", Global.collections.favorites);
var Favorites = Global.collections.favorites;
Favorites();
});
我还为此案例创建了JSFIDLE:
正如您所看到的,当我们试图从未定义的读取值(env
)时,这些代码会产生错误
在StackOverflow上,还有其他关于同一案例的有用信息:
使用它,我能够使它“工作”,请检查以下小提琴:
这里的问题是我必须使用
console.log(Global.Global.env)
由于原始全局现在指向exports对象,所以我们在这里设置了指向全局的链接作为全局
我们也可以在全局模块中执行以下操作,但我相信这是另一个黑客:
_.extend( exports, Global );
在相应的链接中根本没有这样的问题,不确定我做错了什么。我感觉循环依赖是代码组织所遭受的“气味”
在您的情况下,我认为您不需要globals中的collections
字段。如果某些东西依赖于集合,为什么不直接请求集合模块呢
在这种情况下,依赖项将是:集合→ 最爱→ Globals(但Globals不指向收藏夹,因此圆圈被打断)
然后,如果确实需要从头开始加载所有内容,可以修改require()
调用:
require(["global","collections"], function(Global,Collections) { ...
或者定义一个引导模块,该模块需要一切,并且需要:
define("bootstrap",["global","collections","favorites"], function(...) { ...
require("bootstrap", ...)
当然,我没有你的项目的所有细节,所以解决方案可能会有所不同。但主要的一点仍然是,循环依赖是一种气味