我們正在構建一個使用Backbone,RequireJS和Handlebars的非trival web應用程序,以及我只是好奇而已。目前,我們的每個模型的八九不離十是這樣的:如何使用RequireJS實現延遲加載?
define(['Backbone', 'js/thing/a', 'js/thing/b', 'js/lib/bob'], function(a, b, bob) {
return Backbone.Router.extend({
// stuff here
});
});
那裏的東西/一,東西/ B都有自己的依賴關係,例如在車把模板等什麼,現在的情況是,在我的主.js,所有'頂級'路由器都被加載並初始化;每個頂級路由器都有一組依賴項(模型,視圖等),每個依賴項都有自己的依賴關係(模板,幫助程序,utils等)。基本上,一個大樹結構。
這種情況下的問題是整個樹在頁面加載時被解析和加載。我不介意這樣做,因爲我們最終將通過優化器運行它,並最終得到一個大的單個文件(將RequireJS降低爲基本模塊化框架)。不過,我很好奇你是否可以按需求加載視圖和模板等內容。
有「簡化CommonJS的包裹解釋說:」 here,所以我試過了:
define(function(require) {
Backbone = require('Backbone');
return Backbone.Router.extend({
doStuff: function() {
var MyView = require('js/myView');
new MyView().render();
}
});
});
不過,看着Chrome的網絡督察,似乎RequireJS - 不知何故,即使沒有觸發觸發路線doStuff處理程序 - 仍然加載myView
依賴項。問題:
- 這實際上是可能的嗎? RequireJS中是否有黑色磁磚,可以在不觸發
doStuff
路線的情況下尋找require()
的電話? - 這是理論上正確的方式來進行'按需'延遲加載RequireJS模塊和資源嗎?
- 如果你使用這個表示法,r.js優化器是否仍然像廣告一樣工作?