2012-05-24 113 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()需要加載路由器。 路由器對控制器有依賴性。它是具有所有依賴於它所使用的視圖等的控制器。有可能是模型和收藏等。

希望有所幫助。