Как загрузить модуль AMD из слоя Dojo

В нашем приложении мы используем dojo для некоторых виджетов, включая несколько пользовательских виджетов, и используем формат AMD для нескольких модулей.

например

define("foo.bar.module", ["dojo/_base/declare"], function(declare) {

   var module  = declare("foo.bar.module", [], {
      // Do Stuff
   }

   return module;
});

В настоящее время это прекрасно работает, так как каждый модуль запрашивается индивидуально. Тем не менее, мы определили, что использование слоя dojo, чтобы объединить это в один запрос, было бы хорошей оптимизацией.

Проблема в том, что мы загружаем слой заранее, затем пытаемся требовать модули, определенные в слое, но загрузчик dojo не может найти модули. Есть ли что-то особенно необходимое в профиле сборки, чтобы это работало? Некоторая помощь или ссылки на документацию будут с благодарностью.

1 ответ

Решение

Идентификаторы модуля - это пути, а не идентификаторы объектов. Первый аргумент define просто неправильно; так должно быть foo/bar/module если он будет существовать. Однако вы никогда не должны предоставлять первый строковый аргумент define, как это нарушает мобильность. Вы также не должны предоставлять первый строковый аргумент declare если вы намеренно не пытаетесь создавать конструкторы в глобальной области видимости.

Таким образом, определение вашего модуля должно быть:

define(["dojo/_base/declare"], function(declare) {

   var module = declare([], {
      // Do Stuff
   }

   return module;
});

И, наконец, есть две важные вещи, которые нужно отметить о построенных слоях:

  1. Слои - это просто встроенные модули, которые также содержат дополнительные модули. Они должны создаваться только из модулей, которые уже существуют в вашем приложении до сборки. Например, если у вас есть app/main модуль, который вы используете для загрузки всего приложения, который будет хорошим модулем слоя. Создание нового app/layerA Модуль просто для нового слоя был бы неправильным.
  2. Загрузчик не может знать, какие модули содержит слой, пока этот слой не будет загружен. Если вы строите слой "a" с модулями "a", "b" и "c", то require([ "a", "b", "c" ])все три модуля будут загружены как отдельные запросы, потому что загрузчик не может знать, что "a" содержит "b" и "c". В этом случае вы всегда должны сначала загружать "a", а затем загружать "b" и "c", после чего они будут просто загружаться со слоя, а не по отдельности.
  3. За исключением одного слоя, который имеет boot: true в вашем профиле сборки (dojo/dojo), слои должны быть загружены так же, как и любой другой модуль, то есть с использованием require или же define, не включая <script> тег для модуля слоя.
Другие вопросы по тегам