2012-01-15 12 views
5

Mi sono sempre chiesto perché i compressori js non lo fanno. Diciamo che ho uno script minified come questo:Perché i compressori js non lo fanno?

(function($){var a=$("a");1<a.length&&10>a.length?alert(a.length):alert($("p").length)})(jQuery); 

Perché non compilare a qualcosa di simile:

(function($,L){var a=$("a");1<a[L]&&10>a[L]?alert(a[L]):alert($("p")[L])})(jQuery,'length'); 

Significato cambiando ogni occorrenza di un .property con un [minified key] e passare una stringa e ricevitore arg alla iife (in pratica quello che ho fatto in precedenza con la .length)

Immaginate quanto più questo sarebbe minify jQuery con 159 .length, 62 .each, 15 .appendChild ecc. Solo il .length s potrebbe risparmiare oltre 600 byte!

anche utilizzando l'esempio di cui sopra perché ci si spreca spazio su un var parola chiave quando si può prenotare un posto in quel funzioni portata dichiarando un altro parametro:

(function($,L,a){a=$("a");1<a[L]&&10>a[L]?alert(a[L]):alert($("p")[L])})(jQuery,'length'); 

Inoltre, mentre io vi ho qui, perché non mettere l'intero jQuery in una valutazione e salvare su altre 572 function parole chiave (4.5k)?

+0

Ero abituato a scrivere JS in quel modo, a volte lo faccio ancora. Fai anche alcuni trucchi con String.prototype.IO = String.prototype.indexOf o Us = 'undefined'; Ss = 'string'; Ow = window; e String.prototype.has (s) –

risposta

6

Immagino che non voglia supporre che si desideri la spesa di una ricerca variabile oltre alla ricerca della proprietà.

Se si utilizza il compilatore di chiusura, in realtà annullerà tali tipi di riferimenti se lo si fa manualmente.

In definitiva, se si gzip, non penso che queste confusioni si sommano a molto. Non sarei sorpreso se in alcuni casi rendesse la versione gzip più grande.

5

Perché cambierebbe la struttura del codice. Invece di avere un metodo che opera sulla proprietà length di oggetti, la proposta ora fornisce una funzione che consente l'accesso a qualsiasi nome di proprietà passata, che potrebbe essere contrario allo scopo del codice originale.

Ci possono essere anche implicazioni di prestazione per fare questo - o almeno, questo potrebbe causare alcune ottimizzazioni nei tempi di JavaScript per non essere utilizzabili.

Inoltre, tenere presente che la maggior parte dei file di origine JavaScript deve passare attraverso la compressione GZip (negoziata e eseguita in modo trasparente a livello HTTP dalla maggior parte dei server/browser Web), che comprime facilmente qualsiasi istanza duplicata di qualsiasi nome, tra cui "var "e nomi di proprietà riutilizzati.

+0

Non penso che l'uso improprio della funzione sarebbe davvero una ragione. È un IIFE, quindi viene invocato solo una volta con qualsiasi argomento venga fornito. Dovrebbe essere in grado di aggiungere parametri e argomenti alla fine senza ramificazione. Dovrebbe solo fare attenzione che ci sia un numero uguale di ciascuno. –

+1

... a meno che non venga fatto riferimento all'oggetto 'arguments'. –

+4

lascerebbe anche variabili extra fluttuanti per le chiusure – jermel

3

Poiché i minificatori non devono modificare la funzionalità del codice, rimuovere solo i caratteri non necessari.

Problemi correlati