2012-05-01 17 views
14

voglio usare la chiusura compilatore google sulla sorgente javascript che stiamo usando. In modalità sviluppo tendiamo a rompere la funzionalità in molti file, ma per la produzione vorremmo averli combinati in moduli.Come posso suddividere il mio javascript in moduli usando il Closure Compiler di Google?

Quando si chiama il compilatore, posso dargli un elenco di file da includere per la compilazione, ma l'output di quello mostra che il compilatore non ha salvato l'ordine dell'elenco dei file.

Ho cercato su di esso e ho scoperto che posso usare goog.provide/good.require per controllare le dipendenze tra i diversi file js. Il problema di questo è che aggiunge il codice ai miei js, che io non bisogno o vogliono, ad esempio:

goog.provide("mainFile") 

aggiungerà questo:

var mainFile = {}; 

al fascicolo compilato js, qualcosa che non voglio Non stiamo usando la libreria di chiusura di Google, tutto quello che voglio usare è il compilatore.

C'è un modo per dire al compilatore l'ordine dei file senza includere più funzionalità "chiusura biblioteca", che non ho bisogno di? posso creare naturalmente uno strumento della mia che in primo luogo prendere tutti i file, unirli in un unico, che sarà poi l'ingresso del compilatore, ma io preferirei di annullare che, se può essere fatto dal compilatore stesso.


Modifica

L'obiettivo è quello di essere in grado di produrre i moduli come la risposta in questa discussione: Using the --module option in Closure Compiler to create multiple output files

E quindi voglio aggiungere che la capacità di controllare quali file vanno in cui modulo pur avendo il controllo sul loro ordine. Per ora non uso i caratteri jolly, ma ho intenzione di farlo in futuro (se è possibile).

semplicemente "cat file1.js file2.js> combined.js & & compilazione ..." va bene, ma nel nostro caso si tratta di un po 'più complicato e dovremo scrivere un programma/script che lo fa basato su qualche logica. Se possiamo in qualche modo dire al compilatore l'ordine dei file in avanzato potrebbe semplicemente salvare il tempo di attuazione di tale programma.

Grazie.

+1

Come su 'cat file1 file2> Temp && compile -js temp'? – georg

+0

Usi caratteri jolly (* .js) o dichiari ogni file in ordine quando chiami il compilatore? – GillesC

+0

Ho modificato la mia domanda poiché era troppo grande per un commento. Grazie. –

risposta

28

La capacità di Closure-compiler di creare moduli fornisce un potente strumento per separare i file di input in file di output distinti. È progettato in modo tale che diversi moduli possano essere caricati in momenti diversi a seconda delle caratteristiche richieste. Ci sono più flag del compilatore relativi ai moduli.

Ogni uso della bandiera --module descrive un file di output ed è dipendenze. Ogni flag modulo segue la seguente sintassi:

--js inputfile.js 
--module name:num_files:dependency 

Il file di uscita risultante sarà name.js e comprende i file specificati dal flag --js precedente (s).

L'opzione dipendenza è quello che sarà più interessato a. Si specifica quali il modulo genitore è.Le opzioni del modulo devono descrivere una struttura di dipendenze valida (devi avere un modulo base).

Ecco un esempio:

--js commonfunctions.js 
--module common:1 
--js page1functions.js 
--js page1events.js 
--module page1:2:common 
--js page2function.js 
--module page2:1:common 
--js page1addons.js 
--module page1addons:1:page1 

In questo caso, si indica al compilatore che il page1 e moduli page2 dipendono dal modulo comune e che il modulo page1addons dipende dal modulo Pagina1.

Ricordare che il compilatore può spostare e sposta il codice dai file di origine del modulo in altri file di output del modulo se determina che viene utilizzato solo da quel modulo.

Nessuno di questi richiede la chiusura della libreria o l'uso di goog.require/fornire chiamate né aggiunge alcun codice all'output. Se si desidera che il compilatore determini automaticamente le dipendenze o sia in grado di gestirle, è necessario goog.require/fornire chiamate.

+3

Voto in rialzo. Questa è una bella risposta concisa con un ottimo esempio. Perfezionare. Nel testare la tua risposta, non ero in grado di creare moduli che contengono periodi o trattini nel loro nome. È possibile o sto facendo qualcosa di sbagliato? Esempio: '--module common.min: 1' non ha funzionato per me. (Quando dico che non ha funzionato, voglio dire che non è stato creato alcun modulo.) – Karl

+0

Ho fatto un articolo con un semplice esempio nel mio blog su come farlo. Condivisione nel caso in cui altri siano interessati: http://www.syntaxsuccess.com/viewarticle/lazy-loading-with-the-closure-compiler – TGH