Je travaille avec requirejs + jquery et je me demandais s'il y avait un moyen intelligent de faire fonctionner correctement un plugin jQuery avec require.
Par exemple, j'utilise jQuery-cookie. Si j'ai bien compris, je peux créer un fichier appelé jquery-cookie.js et à l'intérieur faire
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"]
}
} );
Je me suis demandé si je pouvais faire des choses comme jQuery, ce qui est comme ceci:
if ( typeof define === "function" && define.amd && define.amd.jQuery ) {
define( "jquery", [], function () { return jQuery; } );
}
ou si c'est le seul moyen de rendre les plugins jQuery compatibles avec requirejs ou tout amd
la source
require(['plugin1', 'plugin2']);
etc. Aucun rappel n'est passé, donc rien ne fonctionnera sauf les scripts du plugin eux-mêmes. Cela signifie qu'ils s'ajouterontjQuery.fn
alors partout ailleurs, vous pouvez simplement lister 'jquery' comme dépendance et ils seront inclus. Comme je l'ai dit, je suis assez nouveau dans ce domaine et il peut y avoir une meilleure approche (comme utiliser simplement unescript
balise), mais cela fonctionne.Il y a quelques mises en garde avec l'utilisation de la configuration shim dans RequireJS, soulignées sur http://requirejs.org/docs/api.html#config-shim . À savoir, "Ne mélangez pas le chargement CDN avec la configuration de shim dans une construction" lorsque vous utilisez l'optimiseur.
Je cherchais un moyen d'utiliser le même code de plugin jQuery sur les sites avec et sans RequireJS. J'ai trouvé cet extrait de code pour les plugins jQuery sur https://github.com/umdjs/umd/blob/master/jqueryPlugin.js . Vous enveloppez votre plugin dans ce code, et cela fonctionnera correctement dans les deux cas.
Le crédit revient à jrburke; comme beaucoup de javascript, ce sont des fonctions à l'intérieur de fonctions agissant sur d'autres fonctions. Mais je pense avoir déballé ce qu'il fait.
L'argument de fonction
factory
dans la première ligne est lui-même une fonction qui est appelée pour définir le plugin sur l'$
argument. Lorsqu'aucun chargeur compatible AMD n'est présent, il est appelé directement pour définir le plugin sur l'jQuery
objet global . C'est exactement comme l'idiome de définition de plugin commun:S'il existe un chargeur de module, alors
factory
est enregistré comme rappel que le chargeur doit appeler après le chargement de jQuery. La copie chargée de jQuery est l'argument. C'est équivalent àla source
factory(jQuery || Zepto);
, mais je ne sais pas comment vous feriez la partie AMD. Je pense que vous devriez définir le "chemin" jQuery sur zepto ??paths: { jquery: 'vendor/zepto/zepto.min' }
shim
essentiellement cela? Je suppose que non ... parce que vous avez dit que vous le codez manuellement comme ci-dessus.$.fn.jqueryPlugin
dans l'extrait, changezjqueryPlugin
le nom du plugin !!Tout comme pour info, tous les plugins jquery utilisent déjà amd / require, vous n'avez donc rien à déclarer dans le shim. En fait, cela pourrait vous causer des problèmes dans certains cas.
Si vous regardez dans le cookie jquery JS, vous verrez définir les appels et require (["jquery"]).
et dans jquery.js, vous verrez un appel à define ("jquery", [], function () ...
la source