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", ...)
当然,我没有你的项目的所有细节,所以解决方案可能会有所不同。但主要的一点仍然是,循环依赖是一种气味