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