gpt4 book ai didi

javascript - 如何正确解决 require.js 中的循环依赖

转载 作者:行者123 更新时间:2023-11-30 05:43:41 25 4
gpt4 key购买 nike

我有以下模块配置:Global -> Collections -> Favorites(全局需要收藏,收藏需要收藏)

同时 Favorites 还需要 Global 模块(用于它的其他属性)。

示例代码:

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();
});

我还为这种情况创建了 jsfiddle:http://jsfiddle.net/NBSzC/

如您所见,当我们尝试从 undefined 中读取值 (env) 时,此代码会产生错误。

在 StackOverflow 上还有其他关于同一案例的有用票证:How to handle circular dependencies with RequireJS/AMD?

使用它我能够让它“工作”,请检查以下 fiddle :http://jsfiddle.net/NBSzC/1/

这里的问题是我必须使用

console.log(Global.Global.env)

因为原来的 Global 现在指向 exports 对象,我们已经将 Global 链接设置为 Global。

我们也可以在全局模块中执行以下操作,但我相信这是另一个 hack:

_.extend( exports, Global );

在相应的链接中完全没有这个问题,不知道我做错了什么。

最佳答案

我觉得循环依赖是代码组织中的一种“味道”。

在您的情况下,我认为您不需要需要全局变量中的collections 字段。如果某些东西依赖于集合,为什么不直接请求集合模块呢?

在这种情况下,依赖关系将是:集合 → 收藏夹 → 全局(但全局不指向收藏夹,因此圆圈被打破)。

然后,如果您真的需要从头加载所有内容,您可以修改 require() 调用:

require(["global","collections"], function(Global,Collections) { ...

或者定义一个需要所有内容的 Bootstrap 模块并要求:

define("bootstrap",["global","collections","favorites"], function(...) { ...
require("bootstrap", ...)

当然我没有你项目的所有细节,所以解决方案可能会有所不同。但要点仍然是循环依赖是一种气味。

关于javascript - 如何正确解决 require.js 中的循环依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19305531/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com