| JavaScript kompresory porovnanie |
|
|
|
| Napísal Ján Šuňavec | ||||||||||||||||||||||||||||||||||||
| 03.01.2011 | ||||||||||||||||||||||||||||||||||||
|
Potreba komprimovať JavaScript vznikla spolu s vývojom veľkých JavaScript frameworkov, ktoré postupom času rástli do stoviek kilobytov. Problematiku veľkých JavaScript súborov sme tiež museli riešiť, aby sme dosiahli čo najrýchlejšie odozvy stránok. Na začiatku bolo nutné nájsť vhodný kompresor. A takto dopadlo naše hľadanie. Technológia kompresiePre komprimácií JavaScriptu sa používajú techniky založené na nahradzovaní reťazcov inými reťazcami. Niečo ako huffmanova kompresia alebo LZ77, len v inom. Techniky si podrobnejšie rozoberieme. Kratšie názvy premennýchVäčšina kompresorov pracuje na základe nahrádzania názvov premenných kratšími názvami. Napríklad namiesto dokument.getElementById sa môže použiť var _a = dokument.getElementById; Odstránenie whitespacesČiže odstránenie enterov, medzier, tabulátorov. Nie je tu veľmi čo vymýšľať. Jednoduchý regulárny výraz rieši tento problém. Odstránenie poznámokAk máte kód dobre komentovaný, týmto ušetríte dosť podstatnú časť veľkosti súboru. Poznámky koncového užívateľa vôbec nezaujímajú. Kratšie názvy funkciíJe to obdoba skracovania názvov premenných. Pri nahradení názvov funkcií nastáva však problém, keď funkcie obsiahnuté v kóde voláte zo súboru, ktorý ste nekoprimovali. Z vašej funkcie showDialogWindow sa totiž stane niečo ako _b. Túto technológiu používa napríklad Google Closure kompresor v ADVANCED móde. Táto technológia vyžaduje mierne úpravy kódu. Kratšie všetkoTokenizer hľadá v texte čo najväčšie reťazce a tie nahradí kratšími kódmi. Táto kompresia je známa ako Huffmanova alebo LZ77 kompresia. Komprimujú sa čo najväčšie reťazce za čo najkratšie. Táto metóda dosahuje najlepšie výsledky komprimácie. Tento typ kompresie podporuje len Packer. Jej jediná nevýhoda je nutnosť mať dekompresor. Dekomprimovanie prebieha na strane užívateľa a zaberie nejaký čas. Rádovo stotiny sekúnd. Optimalizácia kóduOptimalizáciou sa myslí napríklad vynechanie časti kódu, ktorý sa nikdy nemôže vykonať. Alebo sa nahradí kód var a = new Array() za var a = []; Tieto optimalizácie vedú občas k chybám. Preto si výsledný súbor vždy ešte otestujte. Najviac týchto optimalizácií obsahuje Google Closure Compressor.
DOJO ShrinkSavePopis: Dojo ShrinkSave vznikol spolu s frameworkom DOJO, ktorý je jeden z najrozsiahlejších JavaScript frameworkov vôbec. Netreba sa preto diviť, že vývojári združení okolo tohto projektu prišli s vlastným kompresorom. Google Closure CompilerPopis: Všetky Google aplikácie sú spracované práve týmto nástrojom. Ponúka dva základné módy kompresie simple a advance. Pri advance dosahuje naozaj výborné výsledky. Len kód je nutné mierne upravovať. Viac o problematike sa dočítate na http://code.google.com/closure/compiler/docs/api-tutorial3.html
JSMinPopis: Kompresor obsahuje len základné optimalizácie, ktoré sú popísané aj na stránke projektu. Program sa už dlhšie nevyvíja. Posledná verzia je z roku 2003. PackerPopis: Tento kompresor funguje na trochu inom princípe. Celý súbor rozdelí na reťazce a tie si dá do hašovacej tabuľky. Do výsledného súboru si uloží hašovaciu tabuľku a potom samotné nahradené reťazce. V podstate ide o LZ77 kompresiu. Pri tomto type kompresie je však nutný aj dekompresor. Kvôli použitej technológií parsovania je nutné ukončovať funkcie znakom ; čo nie je veľmi bežné. Kompilátor obsahuje niekoľko prepínačov, ktoré dokážu zlepšiť mieru kompresie. V teste sme použili niekoľko nastavení. Čo je zaujímavé, je možné ho kombinovať s inými kompresormi. Len treba predtým upraviť kód z prvého kompresora do podoby ktorú Packer vyžaduje. UglifyJSPopis: Celkom zaujímavý nový kompresor s celkom zaujímavými nastaveniami. Oproti Google Closeure neobsahuje žiadne mikro optimalizácie kódu. Na druhú stranu sa to občas môže hodiť. Celý je písaný v JavaScripte, takže sa dá veľmi rýchlo implementovať online. Posledná verzia je s 08.2010. Na to že má kód len 23 KB dosahuje naozaj veľmi dobré výsledky. YUI CompressorPopis: Kompresor z dielne Yahoo. Tento produkt používa Yahoo pre svoje aplikácie. Okrem iného dokáže optimalizovať CSS. Tak ako DOJO shrinksave je založený na Rhino tokenizéri. Má celkom rozsiahle možnosti nastavenia úrovne kompresie. Posledná verzia je z roku 10.2009. Bolo by načase spraviť menší update.
Výsledky
Čísla hovoria jasne. Do jednej skupiny možno zaradiť JSMin, DOJO ShrinkSave a YUI Compressor. Trochu sklamal DOJO ShrinkSave, od ktorého sme očakávali lepšie výsledky. Prekvapil nás UglifyJS, ktorý na minime kódu dokáže zraziť veľkosť naozaj impozantne. Držíme autorovi palce pri ďalšom vývoji. K top produktom patrí Google Closure Compressor a Packer. Packer nech je nastavený, akokoľvek podáva naozaj veľmi dobré výsledky. Predsa len LW77 je trochu iná káva. Nestačí mu ani Google nastavený na mód ADVANCE_COMPRESSION. Úplne najlepšie výsledky dosiahnete keď skombinujete Google a Packer. Aj keď táto forma je najnáročnejšia na úpravy kódu a možné chyby. Rozumný pomer námaha / veľkosť kódu poskytuje Google Closure Compressor v SINGLE móde, kde stačí súbor len skomprimovať a začať používať. Nezabudnite, že môžete výsledný súbor ešte skomprimovať cez GZIP Linkyhttp://compressorrater.thruhere.net/ - Otestuje kompresiu online v rôznych kompresoroch. Škoda že tam chýba Google Closure. |