Existem algumas ressalvas ao usar a configuração de shim no RequireJS, apontadas em http://requirejs.org/docs/api.html#config-shim . A saber, "Não misture carregamento de CDN com configuração de correção em uma compilação" quando estiver usando o otimizador.
Eu estava procurando uma maneira de usar o mesmo código de plugin jQuery em sites com e sem RequireJS. Eu encontrei este snippet para plug-ins jQuery em https://github.com/umdjs/umd/blob/master/jqueryPlugin.js . Você envolve seu plugin neste código e ele funcionará corretamente de qualquer maneira.
(function (factory) {
if (typeof define === 'function' && define.amd) {
// AMD. Register as an anonymous module depending on jQuery.
define(['jquery'], factory);
} else {
// No AMD. Register plugin with global jQuery object.
factory(jQuery);
}
}(function ($) {
$.fn.yourjQueryPlugin = function () {
// Put your plugin code here
};
}));
O crédito vai para jrburke; como muito javascript, são funções dentro de funções agindo em outras funções. Mas acho que descobri o que está fazendo.
O argumento da função factory
na primeira linha é ele próprio uma função que é chamada para definir o plugin no $
argumento. Quando nenhum carregador compatível com AMD está presente, ele é chamado diretamente para definir o plug-in no jQuery
objeto global . É exatamente como o idioma de definição de plug-in comum:
function($)
{
$.fn.yourjQueryPlugin = function() {
// Plugin code here
};
}(jQuery);
Se houver um carregador de módulo, factory
será registrado como retorno de chamada para o carregador invocar após carregar o jQuery. A cópia carregada do jQuery é o argumento. É equivalente a
define(['jquery'], function($) {
$.fn.yourjQueryPlugin = function() {
// Plugin code here
};
})