Я использую requirejs + jquery + jqueryui. Я прочитал TONS примеров того, как это сделать. Я думаю, что понимаю различные подходы, и мне кажется, что моя настройка должна работать правильно. Тем не менее, я иногда получаю $ .widget не указан ошибка в моих настраиваемых модулях, которые зависят от jquery-ui. Это боль, потому что это противоречиво и трудно воспроизвести, поэтому мне трудно проверить альтернативные подходы.
Я не убираю все мои плагины jquery, потому что их много. Вместо этого я загружаю jquery с помощью отдельного вызова requirejs. Затем, в обратном вызове, я загружаю остальную часть своего материала. Таким образом, мне не нужно поддерживать список прокладок для всех моих jquery-плагинов.
Для jquery-ui я использую прокладку, чтобы она зависела от jquery. Затем все мои пользовательские модули, которые используют фабрику виджета, имеют «jquery-ui» в своем списке зависимостей.
В моих шаблонах ...
requirejs.config({
baseUrl: ATHLETE.siteConfig.jsBaseUrl,
paths: {
'jquery': '//ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min',
'jquery-ui': '//ajax.googleapis.com/ajax/libs/jqueryui/1.8.16/jquery-ui.min'
},
shim: {
"jquery-ui": ['jquery']
},
waitSeconds: 15
});
requirejs(['jquery'], function($) {
requirejs(['site'], function() {
requirejs(['mypage']);
});
});
Обратите внимание, что я загрузки site.js перед тем mypage.js. У них есть общие зависимости. В моей конфигурации сборки я исключаю site.js из mypage.js, поэтому общие зависимости скомпилируются в site.js, а не mypage.js. Поэтому мне нужно полностью загрузить site.js перед загрузкой mypage.js, иначе я могу попытаться загрузить эти общие зависимости отдельно.
Вот пример пользовательского модуля, который зависит от jquery-ui.
define([
'jquery',
'jquery-ui'
],function($) {
$.widget('ui.viewAllSponsorsWidget', $.ui.dialog, {
options: {
autoOpen: false,
dialogClass: 'view-all-sponsor-dialog-wrap',
draggable: false,
modal: true,
resizable: false,
width: 370,
height: 400
}
});
});
Ошибка $ .widget не определен вызывается 5-й линии этого и подобных пользовательских модулей шахты. Опять же, это действительно непоследовательно и трудно воспроизвести. Чаще всего я НЕ получаю ошибку, даже когда я очищаю свой кеш. Может ли кто-нибудь подумать о том, что строка 5 может быть выполнена, прежде чем jquery-ui будет полностью загружен?
ОБНОВЛЕНИЕ 16 августа 2013
Я был в состоянии отследить это вниз немного больше. Я создал простой модуль, который зависит от jquery и jquery-ui.
define([
'jquery',
'jquery-ui'
],function($) {
console.log('$.widget is defined? ' + Boolean($.widget));
console.log('jQuery.widget is defined? ' + Boolean(jQuery.widget));
});
Выход этого заключается в следующем:
LOG: $.widget is defined? false
LOG: jQuery.widget is defined? true
Так или иначе глобальный объект JQuery имеет виджет определен, но копия предоставляется мне requirejs нет.
Когда не удается загрузить jquery-ui, есть ли в консоли ошибка пути? Смотрите также это: http://stackoverflow.com/questions/17026036/require-js-bug-random-failed-to-load-resource/17044595#17044595 – explunit