2011-10-23 18 views
9

Tengo mi script de inicialización principal que llama require() y una de las dependencias es un marco de utilidades, pero algunos de los otros módulos que estoy especificando requieren () también ellos mismos han definido este marco como una dependencia.Cómo maneja AMD (específicamente RequireJs) dependencias en varios módulos

Por ejemplo (Init.js.):

require(['module-a', 'module-b', 'module-c'], function(a, b, c){ 
    // where module-c is the framework 
}); 

Y a continuación, en 'módulo-a' Tengo:

define(['module-c'], function(c){ 
    // utilize module-c framework 
}); 

Entonces, ¿cómo AMD/RequireJS manejan este escenario, ¿Se carga el mismo marco dos veces?

Cualquier ayuda apreciada.

Saludos cordiales, Marcos

Respuesta

6

Sólo se carga una vez, dos de los módulos anteriores tendrán el mismo valor módulo de 'módulo-c'.

+0

Muchas gracias por confirmar! Eso es exactamente lo que esperaba que ocurriera porque, en mi opinión, la especificación de la dependencia dentro de cada módulo tenía más sentido ya que significaba que sería capaz de tomar ese módulo y volver a utilizarlo en otro proyecto totalmente diferente. – Integralist

+1

Internamente, el cargador AMD realiza un seguimiento de (es decir, almacena en caché) todos los módulos.Cuando los módulos se optimizan/concatenan juntos, esto no es interesante. Sin embargo, si alguno de los módulos se carga justo a tiempo, es importante tener en cuenta que el cargador de AMD realiza un seguimiento de _requests_ para que dos solicitudes casi simultáneas no intenten descargar el mismo módulo más de una vez. – unscriptable

2

En caso que su utilidad para otros - Aquí hay una situación que me encontré donde se cargó dos veces al módulo:

Para la siguiente estructura del proyecto:

~/prj/js/app/fileA.js 
~/prj/js/app/util/fileB.js 
~/prj/js/ext/publisher.js 

donde los RequireJS baseurl es ~/prj/js/app

fileA.js se refiere a la dependencia externa (ext) publisher.js como:

//fileA: 
define(['../ext/publisher'], function(){}); 

Pero fileB.js se refiere a la misma dependencia con un camino diferente:

//fileB: 
define(['../../ext/publisher'], function(){}); 

En resumen, tanto para los archivos, los caminos de dependencia son diferentes a pesar de la dependencia se encuentra en la misma ubicación. En este caso, publisher.js se carga dos veces. pestaña

uso de Firebug Net para ver que cargar dos veces:

dependency.js being loaded twice (firebug)

Esto se puede arreglar fácilmente usando paths para configurar la ruta de la carpeta externa (como se explica en el require_js docs):

requirejs.config({ 
    paths: {ext: '../ext'} 
}); 

Después de configurar paths, la dependencia se carga solo una vez con fileA.js y fileB.js ambos usando la misma ruta de dependencia que de la siguiente manera:

//fileA: 
define(['ext/publisher'], function(){}); 

y

//fileB: 
define(['ext/publisher'], function(){}); 
Cuestiones relacionadas