2012-01-07 2 views
2

J'essaie d'obtenir plus en ligne avec AMD, et je suis tombé sur quelque chose dans la source jQuery que je ne peux tout simplement pas comprendre.jQuery 1.7+, AMD (RequireJS), et Global Scope

Voici la section (qui se trouve juste avant la fin du fichier):

if (typeof define === "function" && define.amd && define.amd.jQuery) { 
    define("jquery", [], function() { return jQuery; }); 
} 

D'après ce que je peux voir, l'un des principaux points d'AMD est de garder la portée globale propre. Pourtant, jQuery choisit de renvoyer une référence à lui-même en tant que module, mais infecte toujours l'espace global.

Il me semble, en ajoutant "jQuery.noConflict();" juste avant que le retour ne le résolve et retourne toujours l'objet en tant que module.

Je sais que RequireJS a des fichiers spéciaux spécifiquement pour jQuery, mais je ne suis pas sûr que ce soit nécessaire pour 1.7+.

Ma question est 2 partie:

1) Est-ce que quelqu'un sait pourquoi cette décision a été prise?

2) Étant donné que cette approche n'est pas conviviale, quelqu'un connaît-il une solution plus élégante qui utilise la version standard de RequireJS et de jQuery?

+0

http://stackoverflow.com/questions/4858431/use-requirejs-and-jquery-without-clobbering-global-jquery/9593868#9593868 –

Répondre

3

Ok, juste après la publication, je viens de réaliser que je pouvais procuration à travers un autre fichier:

//main.js 
require.config({ 
    paths : { 
    jquery : 'my/libs/jquery-1.7.1.min', 
    jQuery : 'my/src/jquery' 
} 

et

//my/src/jquery.js 

define([ 
     'jquery' 
    ], 
    function($) { 
     $.noConflict(true); 

     return $; 
    } 
); 

La raison de l'alias « jquery » pour le fichier principal plutôt que il suffit de référencer l'emplacement complet dans le proxy parce que j'utilise une branche de Backbone compatible AMD qui dépend de cet alias:

https://github.com/jrburke/backbone/blob/2b0cfb4282f071cffb14a9573d703da6acc5febd/backbone.js

L'auteur a eu quelques validations acceptées par Document Cloud et espère que cette modification sera également intégrée.

Il sera intéressant de voir s'il y a des failles avec ceci ou quelles réponses supplémentaires il pourrait y avoir de la bataille d'AMD testée.

+0

Comment gérez-vous les plugins jQuery avec cette configuration? Je pense que la raison pour laquelle ils ont laissé $ dans la portée mondiale était que leur bibliothèque de plugins (leur plus grande force) qui ne soit pas construite pour AMD fonctionnerait toujours. – nicholas

+1

N'y a-t-il aucun moyen de créer les plugins $ local et encore utiliser? – ThomasReggi

+0

Avez-vous jeté un coup d'œil sur [shim support pour les bibliothèques non-AMD] (http://requirejs.org/docs/api.html#config-shim)? Ce n'était pas disponible lorsque cette question a été publiée à l'origine. Alors peut-être que cette fonctionnalité le fera. Cependant, je ne l'ai pas testé. –

Questions connexes