2011-10-23 5 views
9

Ho il mio script di inizializzazione principale che chiama require() e una delle dipendenze è un framework di utilità, ma alcuni degli altri moduli che sto specificando tramite require (anche loro stessi hanno definito questo quadro come una dipendenza.Come AMD (in particolare RequireJs) gestisce le dipendenze su più moduli

Per esempio (Init.js):

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

e poi in 'modulo-a' ho:

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

Così come si fa AMD/RequireJs gestire questo scenario, vuol caricare lo stesso schema due volte?

Qualsiasi aiuto apprezzato.

saluti, Mark

risposta

6

Verrà caricato solo una volta, entrambi i moduli sopra otterrà lo stesso valore per modulo 'module-c'.

+0

Molte grazie per la conferma! Questo è esattamente quello che speravo sarebbe successo perché nella mia mente specificare la dipendenza all'interno di ogni modulo aveva più senso in quanto significava che sarei stato in grado di prendere quel modulo e riutilizzarlo altrove in un altro progetto completamente diverso. – Integralist

+1

Internamente, il caricatore AMD tiene traccia di (cioè memorizza le cache) tutti i moduli.Quando i moduli sono ottimizzati/concatenati insieme, questo non è interessante. Tuttavia, se uno qualsiasi dei moduli viene caricato just-in-time, è importante notare che il caricatore AMD tiene traccia di _requests_ in modo che due richieste quasi simultanee non tentino di scaricare lo stesso modulo più di una volta. – unscriptable

2

Incase suo utile ad altri - Ecco una situazione in cui mi sono imbattuto in cui un modulo è stato caricato due volte:

Per la seguente struttura del progetto:

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

dove i RequireJs baseurl è ~/prj/js/app

fileA.js fa riferimento alla dipendenza esterna (ext) publisher.js come:

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

Ma fileB.js riferisce alla stessa dipendenza con un percorso diverso:

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

In breve, per entrambi i file, i percorsi di dipendenza sono differenti anche se la dipendenza è nella stessa posizione. In questo caso, publisher.js viene caricato due volte. scheda

Usa di Firebug Net per vederlo caricare due volte:

dependency.js being loaded twice (firebug)

Questo è facilmente risolto utilizzando paths per configurare il percorso della cartella esterna (come spiegato nel require_js docs):

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

Dopo aver impostato paths, la dipendenza viene caricata una sola volta con fileA.js e fileB.js entrambi utilizzando lo stesso percorso di dipendenza di segue:

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

e

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