2012-05-24 111 views
0

我是新的RequireJS,但似乎打砖墙。RequireJS loading叶模块

麻烦从我的“app”模块开始。我不知道如何告诉RequireJS加载我的叶模块 - 依赖于“app”的软件包。

我想我理解为什么 - 因为系统中没有任何东西依赖于它们,它们也没有在任何地方注册,但我需要处理这种情况。

如何让RequireJS知道这些模块并正确加载它们?

干杯

//index.html 
.... 
<script data-main="app/config" src="/assets/js/libs/require.js"></script> 
.... 

//config.js 
require.config({ 
    deps: [ "app" ], 
    paths: { 
     libs: "../assets/js/libs", 
     plugins: "../assets/js/plugins", 
     jquery: "../assets/js/libs/jquery", 
     underscore: "../assets/js/libs/underscore", 
     backbone: "../assets/js/libs/backbone", 
     marionette: "../assets/js/libs/backbone.marionette" 
    } 
}); 

//app.js 
require(
    [ "jquery", "underscore", "backbone", "marionette" ], 
    function ($, _, Backbone, Marionette) { 
     //.... 
    } 
); 

//app.view.js 
require(
    [ "jquery", "underscore", "backbone", "marionette", "app" ], 
    function ($, _, Backbone, Marionette, App) { 
     //.... 
    } 
); 

//app.route.js 
require(
    [ "backbone", "app" ], 
    function (Backbone, App) { 
     //.... 
    } 
); 

因此:

  • app.js取决于 “jQuery的”, “下划线”, “骨干”, “提线木偶”
  • app.view.js取决于“jquery”,“undercore”,“backbone”,
  • “marionette”,“app”app.route.js依赖于“backbone”,“app”

回答

2

如文档中所述 - > http://requirejs.org/docs/api.html#config 依赖关系在deps数组中定义。它们是在require.js运行时加载的第一件事,当您在加载require.js之前必须定义依赖关系时,它才真正被使用。

这是你的结构应该是什么样子

//config.js 
require.config({ 
    paths: { 
     libs: "../assets/js/libs", 
     plugins: "../assets/js/plugins", 
     jquery: "../assets/js/libs/jquery", 
     underscore: "../assets/js/libs/underscore", 
     backbone: "../assets/js/libs/backbone", 
     marionette: "../assets/js/libs/backbone.marionette" 
    } 
}); 

require(['app']); 

//app.js 
define(
    [ "jquery", "underscore", "backbone", "marionette" ], 
    function ($, _, Backbone, Marionette) { 
     //.... 
    } 
); 

//app.view.js 
define(
    [ "jquery", "underscore", "backbone", "marionette", "app" ], 
    function ($, _, Backbone, Marionette, App) { 
     //.... 
    } 
); 

//app.route.js 
define(
    [ "backbone", "app" ], 
    function (Backbone, App) { 
     //.... 
    } 
); 

记住,所有的库和模块需要兼容AMD,如果你想使用的应用程序像在app.view.js路径那么你需要将它定义为一个。与egis相同,因为如果它们没有在require.config中定义为路径,则无法加载类似[[Backbone],“App”]的模块。

+0

好吧,我明白了。但问题是,我如何让RequireJS知道app.view.js和app.route.js?由于require(['app']),系统知道应用程序,但没有任何关于app.view.js和app.route.js的知识,因此它们不会被加载,只有app被加载。 –

+0

任何你想加载你需要或定义的东西。所以你对app.view.js和app.route.js也一样。通常的模式是,你初始化所有你需要在app.js中启动你的应用程序。所以在app.js中,你需要在你的define语句中创建一个你定义的新实例,例如'define(['app.route.js','app.view.js'],function(appRoute ,appView){var route = new appRoute(); var mainView = new appView();}' – nimrod

1

这是我如何启动:

// main.js 
define(["jquery", "app", "router"], function ($, App) { 
    "use strict"; 
    // domReady plugin maybe best used here? 
    $(function() { 
    App.start(); 
    }); 
}); 

// app.js 
define(["backbone", "marionette"], function (Backbone) { 
    "use strict"; 
    var app = new Backbone.Marionette.Application(); 
    app.on("initialize:after", function(options){ 
    if (Backbone.history){ 
     Backbone.history.start(); 
    } 
    }); 

    return app; 
}); 

// router.js 
define(["backbone", "controller", "marionette"], function(Backbone, controller) { 
    "use strict"; 
    var Router = Backbone.Marionette.AppRouter.extend({ 
    appRoutes: { 
     "": "index" 
    } 
    }); 
    return new Router({ 
    controller: controller 
    }); 
}); 

// controller.js 
define(["view"], function(View) { 
    return { 
    "index": { 
     new View(); // Do what you like here… 
    } 
    } 
}); 

// view.js 
define(["backbone"], function(Backbone) { 
    // view here 
}); 

我假设依赖性router.js可以穿上app.js但基本上调用Backbone.history.start()需要加载路由器。 路由器对控制器有依赖性。它是具有所有依赖于它所使用的视图等的控制器。有可能是模型和收藏等。

希望有所帮助。