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