Мы создаем нетривиальное веб-приложение, используя Backbone, RequireJS и Handlebars, и мне просто любопытно. На данный момент каждая из наших моделей выглядит примерно так:
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 по-прежнему работает так, как рекламируется, если вы используете эту нотацию?