Jak osiągnąć leniwe ładowanie za pomocą RequireJS?
Budujemy aplikację internetową bez triali, używając Backbone, RequireJS i Handlebars, i cóż, jestem po prostu ciekawy. W tej chwili każdy z naszych modeli wygląda tak:
define(['Backbone', 'js/thing/a', 'js/thing/b', 'js/lib/bob'], function(a, b, bob) {
return Backbone.Router.extend({
// stuff here
});
});
gdzie rzecz / a, rzecz / b mają swoje własne zależności, na przykład na szablonach Handlebars itp. Teraz dzieje się tak, że w moim main.js wszystkie routery „najwyższego poziomu” są ładowane i inicjowane; każdy router najwyższego poziomu ma zestaw zależności (modeli, widoków itp.), z których każdy ma własne zależności (szablony, pomocniki, narzędzia itp.). Zasadniczo duża struktura drzewa.
Problem w tym przypadku polega na tym, że całe drzewo jest rozwiązywane i ładowane przy ładowaniu strony. Nie przeszkadza mi to, że w końcu przejdziemy przez optymalizator i skończymy z jednym dużym pojedynczym plikiem (redukując RequireJS do zasadniczo struktury modularyzacji). Jestem jednak ciekawy, czy można ładować takie rzeczy, jak widoki i szablony „na żądanie”.
Wyjaśniono „uproszczone opakowanie CommonJS”tutaj, więc spróbowałem tego:
define(function(require) {
Backbone = require('Backbone');
return Backbone.Router.extend({
doStuff: function() {
var MyView = require('js/myView');
new MyView().render();
}
});
});
Jednak patrząc na inspektora sieci Chrome, wydaje się, że RequireJS - w jakiś sposób, nawet bez wyzwalania trasy, która uruchamia program obsługi doStuff - nadal ładujemyView
zależność. Pytania:
require()
bez aktywowaniadoStuff
trasa?Czy jest to teoretycznie poprawny sposób poruszania się po „na żądanie”, leniwym ładowaniu modułów i zasobów RequireJS?Czy optymalizator r.js nadal działa tak, jak jest reklamowany, jeśli używasz tej notacji?