2014-09-16 4 views
1

Я пытаюсь получить плагин 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 обертки ...

ответ

0

Просто использовать

return jQuery.noConflict(true); 

вместо

return jq.noConflict(true); 

так как локальные переменные внутри requirejs, ваши плагины могут использовать переменную JQuery для параметра $

(function($) {$.extend($.myPlugin, { myPlugin: { version:'0.0.1'} });})(jQuery); 

Конфиг, который работает для меня:

- main.js

- JQuery-private.js

В главном.JS файл:

require.config({ 
    paths: { 
    }, 
    map: { 
    '*': { 'jquery': 'jquery-private' }, 
    'jquery-private': { 'jquery': '//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js' } 

    }, 
    shim: { 
    myplugins: ['jquery'] 
    } 
}); 

В Jquery-private.js файла:

define(['jquery'], function() { 
    jQuery = $.noConflict(true); 
    return jQuery; 
}); 
Смежные вопросы