Я пытаюсь получить плагин jQuery, работающий правильно с RequireJS, при использовании jQuery в состоянии noconflict/noglobal, чтобы заставить все модули указывать, требуется ли им jQuery. Однако для плагинов, не совместимых с AMD, конфигурация shim
, похоже, не работает. А именно, если плагин JQuery определяется с оболочкой, как:Требование jQuery плагин плагин не работает?
(function($) {
$.extend($.myPlugin, { myPlugin: { version:'0.0.1'} });
})(jQuery);
Тогда следующая конфигурация RequireJS не работает:
requirejs.config({
paths: {
jquery: ['//ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min', 'jquery-min'],
},
map: {
'*': { 'jquery': 'jquery-noglobal' }, // Force all modules to use the non-global jQuery...
'jquery-noglobal': { 'jquery': 'jquery' } // ...except the wrapper module itself, which needs the real one.
},
shim: {
'sadPlugin': {
deps: ['jquery']
}
}
});
jquery-noglobal.js
:
define(['jquery'], function(jq) {
return jq.noConflict(true);
});
ошибка, пожары когда код плагина запускается: «не может звонить extend
на undefined
», то есть jQuery
никогда не устанавливался на внешний уровень, поэтому $
не определено внутри функции самоисполнения. Я поставил точки останова вне функции самозапуска плагина и внутри, чтобы проверить это.
Я предполагаю, что частью проблемы является капитализация; модуль был написан для ожидания jQuery
(camelCase), а имя модуля AMD - jquery
(нижний регистр). Есть ли какой-либо способ в конфигурации shim
указать, какие должны быть имена переменных вложенных требований?
Я также попытался добавить sadPlugin: {'jquery':'jquery'}
запись в map
хэш, в надежде сделать shim
дать этому модулю глобальный Jquery вместо неглобальную один, но по-прежнему JQuery/$ не определяется временем функция вызывается.
EDIT: Найдено один ляп, который действительно отвечает часть проблемы: в соответствии с комментарием нашли here, то deps
из shim
должны быть полный путь к файлу скрипта для загрузки, и не может быть псевдоним из конфигурации paths
.
Так, так как мой CDN-резервный файл JQuery является jquery-min.js
, если я:
shim: {
'sadPlugin': {
deps: ['jquery-min']
}
}
плагин работает! Однако, поскольку в настоящее время используется «реальный» JQuery, загрязняет глобальное пространство имен, а переменная $
тогда доступен без require()
Инг, поэтому побеждает всю цель noglobal
обертки ...