2013-05-29 23 views
5

mio config sviluppo (nel file "index.html") per RequireJS è:RequireJS percorsi config

<script src="require-2.1.5.min.js"></script> 
<script> 
    require.config({ 
     baseUrl: 'js', 
     paths: { 
      angular: 'libraries/angular-1.1.5.min', 
      jquery: 'libraries/jquery-2.0.0.min', 
      underscore: 'libraries/underscore-1.4.4.min', 
      ... 
      zeroclipboard: 'plugins/zeroclipboard-1.0.7.min', 
      tablesorter: 'plugins/jquery.tablesorter-2.9.1.min', 
      ... 
     }, 
     shim: { 
      'angular': { 
       exports: 'angular' 
      }, 
      'underscore': { 
       exports: '_' 
      } 
     }, 
     packages: [ 
      { 
       name: 'index', 
       location: 'app/index', 
       main: 'main' 
      } 
     ] 
    }); 

    require(['index']); 
</script> 

Ma sulla produzione ho solo 2 file concatenati per le librerie e plugin:

js/libraries.js // all jQuery, AngularJS, RequireJS, Underscore and other libraries concatenated 
js/plugins.js // all plugins (already an AMD modules, no need for "shim" config) concatenated 

Quindi, come posso scrivere i miei "percorsi" di configurazione ora? Non ho alcun 'libraries/angular-1.1.5.min.js' e altri percorsi.

La mia soluzione è quella di scrivere:

paths: { 
     angular: 'libraries', 
     underscore: 'libraries' 
    } 

associo AngularJS e sottolineatura per file '' libraries.js e tutto funziona perfettamente. (Non c'è bisogno di jQuery e tutti i plugin - sono già un modulo AMD).

Ma è un modo giusto per scrivere percorsi? La mia soluzione mi sembra una soluzione sporca, non la soluzione migliore.

miei r.js processo di compilazione:

({ 
baseUrl: 'scripts', 
paths: { 
    jquery: 'jquery-2.0.0.min', 
    ... 
    tablesorter: 'jquery.tablesorter-2.0.5.min', 
    zeroclipboard: 'zeroclipboard-1.0.7.min' 
}, 
name: 'foo/main', 
exclude: [ 
    'angular', 
    'jquery', 
    ... 
    'tablesorter', 
    'zeroclipboard' 
], 
optimize: 'uglify', 
out: 'production/js/foo.js' 
}) 

UPD 1:

Quello che voglio:

www.mysite.com/about.html: 

<script src="js/libraries.js"></script><-- jQuery (already AMD), AngularJS (not AMD), RequireJS, Underscore (not AMD) and other libraries already here, only 1 http request needed //--> 
<script src="js/plugins.js"></script><-- all AMD //--> 
<script> 
    require.config({ 
     baseUrl: 'js', 
     paths: { 
      angular: WHAT I NEED TO WRITE HERE?, 
      underscore: WHAT I NEED TO WRITE HERE? 
     }, 
     shim: { 
      'angular': { 
       exports: 'angular' 
      }, 
      'underscore': { 
       exports: '_' 
      } 
     }, 
     packages: [ 
      { 
       name: 'about', 
       location: 'js', 
       main: 'about' 
      } 
     ] 
    }); 

    require(['about']); // will load "js/about.js" 
</script> 

UPD 2:

Ok, è chiaro su "prio rity ", quindi, non ho bisogno del primo e del secondo tag« script »(ma ho bisogno di separare" Require.js "da" libraries.js ") - RequireJS li caricherà automaticamente. Ma cosa si dovrebbe fare con le librerie non AMD nel file "libraries.js"?

AngularJS e UnderscoreJS sono moduli non AMD, è per questo che devo usare "shim", giusto? Ma per far funzionare "shim", ho bisogno di usare anche "path", quindi "shim" può individuare i moduli shimmed, giusto? Ma ho ancora solo 1 file - "libraries.js" e non riesco a scriverlo in opzione "percorso" ... Solo davvero bloccato ...

+0

Non si dovrebbe aggiungere in quei tag di script aggiuntivi, require.js può, e dovrebbe, caricare quelli per voi.La mia risposta qui sotto sull'opzione prioritaria non è chiara? –

+0

È tutto fantastico con la tua risposta, ho appena fatto un aggiornamento prima di leggere il tuo aggiornamento :) – artuska

risposta

5

Per avere il codice di libreria comune precaricato, è necessario utilizzare l'opzione di configurazione di priorità. si potrebbe mettere qualcosa di simile nel tuo foo/main.js file di

require.config({ 
    priority: ["libraries", "plugins"] 
}); 

E poi il tuo file di generazione potrebbe essere la seguente. Il file di librerie e plug-in deve contenere un'istruzione define che definisca tutte le dipendenze considerate generali/scaricate una volta.

({ 
    baseUrl: 'scripts', 
    paths: { 
     jquery: 'jquery-2.0.0.min', 
     ... 
     tablesorter: 'jquery.tablesorter-2.0.5.min', 
     zeroclipboard: 'zeroclipboard-1.0.7.min' 
    }, 
    modules: [ 
     { 
      name: 'foo/main' 
      excludes: ... 
     }, 
     { 
      name: 'libraries' 
     }, 
     { 
      name: 'plugins' 
     } 
    ], 
    optimize: 'uglify', 
    out: 'production/js/foo.js' 
}) 
+0

«l'idea è che tutto il codice di bootstrap richiesto sia caricato tramite 1 file». Ad esempio, ho 3 pagine sul mio sito web: su, portfolio, contatti. Realizzo 3 file diversi con i miei moduli (un sacco di moduli "define" concatenati in 1 file): "about.js", "portfolio.js", "contacts.js". E il 4 ° file è "librerie + plugins.js" - perché voglio che il browser metta in cache questo file e non lo scarichi mai più. Non posso permettermi di inserire il codice "librerie + plugins.js" in ognuno dei file "about.js", "portfolio.js", "contacts.js". – artuska

+0

Ah sì, questo ha molto senso. Penso che sia necessario dare un'occhiata alle opzioni di configurazione 'priority' per consentire l'output multilivello http://requirejs.org/docs/1.0/docs/faq-optimization.html#priority –

+0

@artuska ho modificato la mia domanda in per riflettere meglio l'opzione prioritaria in js richiede –

2

Si dovrebbe usare la stessa configurazione per entrambi gli ambienti. E questa configurazione che devi avere nel file esterno. Quando lo ottimizzi usando r.j, tutti i moduli sono già in quel singolo file in modo che RequireJS li utilizzi senza caricare. Sembra che tu abbia bisogno di mettere a punto il tuo processo di costruzione.

Acquista il mio recente blog post su di esso.

+0

Aggiunto il mio script di sviluppo r.js. Anche dopo il tuo blogpost non capisco, come è possibile mantenere la mia configurazione allo stesso modo per lo sviluppo e la produzione (nel file "index.html"). Come potete vedere, escludo alcuni file dalla build finale per inserirli in un file separato (libraries.js) in modo che il browser lo tenga in cache e non lo scarichi nuovamente per altre pagine sul mio sito web. "libraries.js" contiene sia le librerie dei moduli AMD (come jQuery, è già un modulo AMD nel suo nucleo) che le librerie non AMD (come AngularJS). Quindi, non esiste un "define" per AngularJS nel file "libraries.js". – artuska

+0

Forse dovrei rendere manualmente tutte le librerie come moduli AMD? Voglio dire, basta modificare il file Angular.js e avvolgere il suo codice nella funzione "define ('angular', [], function() {...})"? – artuska

+0

Immagino che sarebbe logico escludere quei grandi moduli dalla compilazione. Si consiglia di controllare https://github.com/tnajdek/angular-requirejs-seed project dove AngularJS viene utilizzato insieme a RequireJS. –

Problemi correlati