Мы создаем нетриверное веб-приложение с использованием Backbone, RequireJS и Handlebars, и хорошо, мне просто интересно. На данный момент каждый из наших моделей Сорта выглядит следующим образом:Как достичь ленивой загрузки с помощью RequireJS?
define(['Backbone', 'js/thing/a', 'js/thing/b', 'js/lib/bob'], function(a, b, bob) {
return Backbone.Router.extend({
// stuff here
});
});
где вещь/а, вещь/б оба имеют свою собственную зависимость, например, на шаблоны рулей и т.д. То, что происходит сейчас, что в моем главном .js, все маршрутизаторы верхнего уровня загружаются и инициализируются; каждый маршрутизатор верхнего уровня имеет набор зависимостей (модели, представления и т. д.), каждый из которых имеет свои собственные зависимости (шаблоны, помощники, утилиты и т. д.). В основном, большая древовидная структура.
Проблема в этом случае заключается в том, что все это дерево разрешено и загружается при загрузке страницы. Я не возражаю против этого, потому что мы запустим его через оптимизатора и в итоге получим один большой отдельный файл (что уменьшит 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, который ищет вызовы на
require()
, фактически не запуская маршрутdoStuff
? - Является ли это теоретически правильным способом «по требованию», ленивой загрузкой модулей и ресурсов RequireJS?
- Поддерживает ли оптимизатор r.js рекламу, если вы используете эту нотацию?