2011-01-28 14 views
5

Sto facendo alcune ottimizzazioni e ho deciso di comprimere i miei file javascript usando YUI Compressor. Il problema è che mancano alcune linee di codice ";" alla fine, dal momento che javascript lo consente e gli sviluppatori non guardano troppo a questo.Controlla javascript per mancante ";" prima della compressione

Sarà un problema quando il codice viene compresso? Se lo è, c'è un modo per controllare javascript per le linee che mancano ";"?

+4

Non ho familiarità con YUI Compressor, ma se cambia la semantica del javascript sintatticamente valido, allora è rotto ... – Jon

+1

Se si rimuovono le ritorte a capo in JavaScript con punto e virgola, si romperà .. senza che il compressore si rompa. Oltre a ciò, il codice IMO JavaScript in cui i punti e virgola non vengono utilizzati correttamente viene interrotto. Dovrebbero davvero rovinare la compatibilità e imporre il punto e virgola .. o almeno aggiungere una modalità per rafforzarla (non 'usa strict;' lo fai già?) – ThiefMaster

+0

@ThiefMaster Trovo vergognoso che così tante persone credano che il punto e virgola riduca in qualche modo il numero di problemi nel codice o che l'ASI sia in qualche modo difficile da "correggere". Posso contare il numero di punti e virgola nel mio codice sulle dita. Uno strumento JavaScript che non capisce JavaScript è semplicemente rotto. Un programma che usa il punto e virgola "perché devono essere lì" è altrettanto rotto. (Non sono contrario ai programmatori che usano il punto e virgola in JavaScript, solo quelli che non possono apprezzare * altri * scrivere in uno stile privo di semi-colon). –

risposta

9

jsLint può controllare il tuo codice per questo. E sì, molto probabilmente causerà problemi a meno che il compressore non contenga effettivamente un parser JavaScript e risolva attivamente il punto e virgola mancante.

+0

yup jsLint controllerà per quello. Farà del male ai tuoi sentimenti (prima citazione jsLint.com);) – Alfred

+1

E te lo meriti totalmente se scrivi codice scadente. ;) – ThiefMaster

+1

@ThiefMaster Si assume erroneamente che la mancanza di punti e virgola faccia "codice scadente". Non è così. Il codice scadente è un codice schifoso - semi-colon o non (o "passando" jsLint o no, per quello). Il buon codice è un buon codice - punto e virgola. –

1

È sempre possibile utilizzare regexp per la corrispondenza per linee nuove che non hanno; prima di loro, e naturalmente fare eccezioni per cose come linee vuote,)} ecc.

Ma a dire il vero, se davvero non fa già questo genere di cose automaticamente, sembra che sia davvero rotto \ semplicemente cattivo.

+0

Non è la migliore idea di usare un'espressione regolare per questo genere di cose (in generale :-), ma potresti essere interessato a [come funziona jsmin] (http : //www.crockford.com/javascript/jsmin.html). Non ridimensiona correttamente tutto il codice, ma fa un buon lavoro al massimo codice e spiega le regole (* sostituzione del testo *) oltre a notare alcune limitazioni con l'approccio. Benvenuti in SO. –

+0

Ben spiegato lì. Lo sto già usando con uno dei miei siti Drupal, ma non ho letto come funziona. Grazie per il benvenuto! – red

3

In base allo this SO answer, il compressore YUI è in grado di gestirlo.

+0

Secondo i documenti (http://developer.yahoo.com/yui/compressor/#using): Mantieni il punto e virgola non necessario (ad esempio prima di un '}') Questa opzione è utile quando il codice compresso deve essere eseguito tramite JSLint (come nel caso di YUI, ad esempio). Quindi, questo non fa ... –

2

Ho eseguito un semplice test su tre compressori JavaScript: Yuicompressor, Yuglify e Google Closure Compiler. Sul mio PC con Ubuntu 12.10, ho scaricato i binari di ogni compressore, e poi testato questo file su ognuno di loro:

function dbz(){ 
    var goku = 1 
    var vegeta = 2 
    var freeza = 3 
    console.log(goku + vegeta + freeza) 
} 
dbz() 

Ed ecco i risultati:

Yuicompressor (2.4.7):

function dbz(){var b=1;var c=2;var a=3;console.log(b+c+a)}dbz(); 

Yuglify (0.1.2):

function dbz(){var e=1,t=2,n=3;console.log(e+t+n)}dbz(); 

Closure Compiler-(versione 20.121.212 revisione 238 8):

function dbz(){console.log(6)}dbz(); 

Anche se questo è un esempio molto semplice, tutto ha funzionato bene su linee con punto e virgola mancante. Tutti hanno rilevato righe senza punto e virgola alla fine, l'hanno aggiunto e rimosso l'interruzione di riga in seguito.

Problemi correlati