Как добиться ленивой загрузки с помощью 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
  });
});

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

61
задан fwielstra 6 June 2012 в 08:53
поделиться