¿Usar requeríajs y jQuery, sin golpear a JQuery global?
Pregunta
Estoy usando requestjs por primera vez en un proyecto. Estoy trabajando en un entorno que ya tiene mucho JavaScript, y estoy buscando formas limpias de presentar mi propio código.
El problema que tengo es que parece que no puedo encontrar un módulo de jQuery que pueda cargar que no golpee la jQuery existente.
Me sorprendió que incluso Requend-Jquery.js presente una versión global de jQuery. ¿Hay alguna forma de cargar jQuery como módulo sin introducir globales?
Solución
JQuery 1.7 admite la carga AMD. Pero, el truco es evitar un conflicto de nombres de módulos, ya que jQuery codifica su propio nombre del módulo como 'jQuery'. Si está definiendo otro módulo como 'jQuery' (digamos, en la propiedad de 'rutas' en su configuración de requisitos), causará dicho conflicto.
Para cargar jQuery en su alcance de la aplicación requerida, defina un módulo, como 'jQuery-Loader' y cuando desee cargar jQuery, hágalo a través de 'jQuery-Loader':
define(['path/to/jquery.min'], function () {
return jQuery.noConflict(true);
});
Requestjs 'almacenará' su referencia a jQuery para que nofonflict solo ejecute la primera vez que se cargue jQuery-Loader.
Otros consejos
Múltiples versiones de jQuery en una página son malas. Deje de piratear y actualice jQuery o use la versión anterior.
En cuanto a mantener $
intento seguro
(function($) {
// requirejs inclusion block for loading
}(jQuery.noConflict(true));
Si pasas true
a .noConflict
reemplazará el viejo jQuery
variable y no destruir eso globalmente.
Esto significa que puedes pasarlo en silencio. Di que tienes
<script src="jquery-1.2">
<script src="jquery-1.5">
Luego, usar el código anterior pondría el 1.2 $
& jQuery
Volver en el espacio global y darle la 1.5 jQuery como local $
En tu cierre
De nuevo aconsejo De nuevo Usando múltiples versiones porque es un desastre correcto y una pesadilla de mantenimiento.
Si está usando 1.5, también puede usar .sub
para permitirte extender jQuery
localmente sin corromper el global jQuery
Cargue el script jQuery y luego use var myJ = jQuery.noConflict();
o cualquier variable de acceso directo que desee