Как добиться ленивой загрузки с RequireJS?

Мы создаем нетривиальное веб-приложение с использованием Backbone, RequireJS и Handlebars, и мне просто любопытно. На данный момент каждая из наших моделей Сорта выглядит так:

define(['Backbone', 'js/thing/a', 'js/thing/b', 'js/lib/bob'], function(a, b, bob) {
  return Backbone.Router.extend({
    // stuff here
  });
});

where thing / a, thing / 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 по-прежнему работает так, как рекламируется, если вы используете эту нотацию?

Ответы на вопрос(2)

Ваш ответ на вопрос