Estou trabalhando com requirejs + jquery e queria saber se havia uma maneira inteligente de fazer um plugin jQuery funcionar bem com o require.
Por exemplo, estou usando o jQuery-cookie. Se bem entendi, posso criar um arquivo chamado jquery-cookie.js e dentro fazer
define(["jquery"], // Require jquery
function($){
// Put here the plugin code.
// No need to return anything as we are augmenting the jQuery object
});
requirejs.config( {
"shim": {
"jquery-cookie" : ["jquery"]
}
} );
Eu me perguntei se eu poderia fazer coisas como o jQuery faz, que é assim:
if ( typeof define === "function" && define.amd && define.amd.jQuery ) {
define( "jquery", [], function () { return jQuery; } );
}
ou se esta é a única maneira de tornar os plug-ins jQuery compatíveis com requirejs ou qualquer amd
fonte
require(['plugin1', 'plugin2']);
etc. Nenhum retorno de chamada é passado, então nada será executado, exceto os próprios scripts de plug-in. Isso significa que eles serão adicionados a si mesmos parajQuery.fn
que em todos os outros lugares você possa apenas listar 'jquery' como uma dependência e eles serão incluídos. Como eu disse, sou muito novo nisso e pode haver uma abordagem melhor (como apenas usar umascript
tag), mas funciona.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.
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 nojQuery
objeto global . É exatamente como o idioma de definição de plug-in comum: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 afonte
factory(jQuery || Zepto);
, mas não sei como você faria a parte AMD. Eu acho que você teria que definir o "caminho" do jQuery para zepto ??paths: { jquery: 'vendor/zepto/zepto.min' }
shim
essencialmente isso? Eu acho que não .. porque você disse que está codificando manualmente como o acima.$.fn.jqueryPlugin
no snippet, mudejqueryPlugin
para o nome do plugin !!Assim como um FYI para todos os plug-ins jquery já usam amd / require, você não precisa declarar nada no shim. Na verdade, isso pode causar problemas para você em alguns casos.
Se você olhar no JS do cookie jquery, verá define calls e require (["jquery"]).
e em jquery.js você verá uma chamada para definir ("jquery", [], function () ...
fonte