在创建Application之前,在Marionette + RequireJS应用程序中声明所有依赖项

时间:2014-01-03 20:49:15

标签: javascript architecture requirejs marionette

我正在使用Marionette和RequireJS构建一个新的应用程序,我有以下结构:

/main.js -- Main require() call that includes app.js and calls Application.start()
/app.js -- Application definition
/modules
    /sub
        /controller.js -- Defines a sub-application, requires app.js
    ...

我正在尝试将依赖项保留在每个文件的顶层,而不是使用require()内联,以便r.js编译器可以找到它们。问题是,在我的controller.js文件中,我需要app.js(为了添加初始值设定项),因此我需要controller.js中的app.js,直到之后< / strong>应用程序已初始化,这意味着我无法将controller放入顶级define()数组中。

当前工作代码的简化示例:

// app.js
define(['marionette'], function(Marionette) {
    var Application = new Marionette.Application();
    Application.on("initialize:after", function() {
        require(['modules/sub/controller'], function() {
            Backbone.history.start();
        });
    });
});

// controller.js
define(['app'], function(Application) {
    Application.module('SubApplication', function(SubApplication, Application, Backbone, Marionette, $, _) {
        var router = Marionette.AppRouter.extend({
            appRoutes: { "foo": "bar" }
        });
        var controller = { foo: function() {} };
        Application.addInitializer(function() {
            new router({ controller: controller });
        });
    });
});

我对Require和Marionette都很新,所以欢迎任何建议!我知道我可以通过include选项将我想要的文件包含到r.js,但我认为这个问题值得一提。

1 个答案:

答案 0 :(得分:0)

我选择在book on Marionette and RequireJS中执行此操作的方法是要求内联仅为功能子集所必需的模块。这简化了开发,也意味着除非触发代码路径,否则不会加载模块。

R.js会很好地找到内联依赖项(假设它们被定义为字符串,即不是动态计算的)。此外,它们还可以与Almond.js一起使用(但不要忘记在构建文件中使用findNestedDependencies选项)。

希望这有帮助!