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.
(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
};
}));
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:
function($)
{
$.fn.yourjQueryPlugin = function() {
// Plugin code here
};
}(jQuery);
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 à
define(['jquery'], function($) {
$.fn.yourjQueryPlugin = function() {
// Plugin code here
};
})