使用require.js交叉访问模块?

时间:2013-12-24 15:28:36

标签: javascript module requirejs

我正在为客户开发一款游戏,而且我在使用require时遇到了一些困难。我只是将我的代码拆分为两个主要文件game.jsgui.js,它们似乎没有相互访问权限。

我首先定义的模块似乎可以访问第二个 - 但第二个模块无法访问第一个模块。

这是我的main.js

requirejs.config({
    paths: {
        jquery: [
            'http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min',
            'libs/jquery.min',
        ],
        //libraries
        kinetic:    'libs/kinetic.min',
        gui:        'gui',
        game:       'game'
    },
    shim: { 
        'gui':      ['jquery', 'kinetic'],
        'game':     ['jquery', 'kinetic']
    }

});
require([
    'jquery', 'kinetic', 'gui', 'game'
], function($, Kinetic, Gui, Game) {
    $(function(){
        Gui.init();
        Game.init();
    });
});

在这种情况下,gui.js可以访问游戏 - 但game.js将Gui视为undefined。如果我试图将Gui重新加入游戏,请将菜肴暂停。

我的game.js定义了Gui:

define([
    "jquery",
    "kinetic",
    "gui"
], function($, Kinetic, Gui){ ... });

我的gui.js定义了游戏:

define([
    "jquery",
    "kinetic",
    "game"
], function($, Kinetic, Game){ ... });

我是新要求的,所以我确定我只是做错了。如何让game.jsgui.js互相访问?如果您需要更多信息,请与我们联系。

1 个答案:

答案 0 :(得分:2)

您有循环依赖:guigamegui。这是有问题的。

在此问题上查看RequireJS的文档:http://requirejs.org/docs/api.html#circular

更好的是,打破循环依赖。这是一篇很好的文章,您可能也会找到其他文章:http://misko.hevery.com/2008/08/01/circular-dependency-in-constructors-and-dependency-injection/