Îmbunătățim compresibilitatea codului javascript

Există câteva tehnici de programare simple care pot mări compresibilitatea codului JS.

De exemplu, aici este un script:

După minizare:

Pe de altă parte, numele unei funcții din acest script este o variabilă globală, nu este comprimată pentru a salva capacitatea de a accesa funcția.

Din aceleași motive, metodele de apel și zbor SpaceShip nu sunt comprimate. getDistance ().

Deci, hai să facem un script mai real și să lăsăm compresorul YUI pe el.

Din păcate, în compresorul YUI nu poți dezactiva uciderea transferurilor de linie, așa că sa dovedit a fi:

Dacă te uiți atent, poți vedea că variabilele locale nu s-au micșorat deloc în SpaceShip. și numai comprimat în funcția flyToMoon.

ShrinkSafe comprimă perfect tot ce poate.

Toate variabilele locale sunt înlocuite cu variante mai scurte.

De ce nu YUI stoarce, dar a reușit ShrinkSafe?

Problema este în construcție cu () în metoda showWarning. Aceste două compresoare sunt diferite de acestea.

ShrinkSafe ignoră numele variabilelor non-locale cu:

Din păcate, în ultima versiune ShrinkSafe există o eroare: dacă proba variabilă este declarată local, atunci ea este înlocuită:

De exemplu, dacă val = . atunci comprimat cu această construcție cu va lucra incorect, din cauza compresiei prop de la _1.

Cu toate acestea, nu am auzit niciodată că cineva de pe un astfel de bug a intrat într-adevăr. Aparent, variabilele locale ale oamenilor nu declară aceleași nume cu proprietățile argumentului cu. că codul a fost mai ușor de înțeles.

În interiorul operatorului cu (obj), nu puteți spune niciodată exact dacă o variabilă va fi luată din vol sau dintr-un domeniu de aplicare extern.

Prin urmare, nu pot fi comprimate variabilele din interiorul cu.

Și dacă da, se pare că variabilele locale cu nume menționate în interior nu pot fi comprimate nici.

Compresor YUI dintr-un motiv oarecare (de ce? Există idei?) A mers chiar mai departe: nu micizează nici o variabilă locală chiar și în funcțiile învecinate.

ShrinkSafe iubește, dar cu un bagofichey.

Dacă înlocuiți showWarning cu o opțiune fără cu. atunci YUI va comprima codul fără probleme:

Rezultatul compresiei YUI fără:

Exemplul nu a micșorat apelurile la obiectul documentului.

Pentru ca compresia să funcționeze, trebuie să înlocuiți apelul cu documentul variabil global cu un apel de funcție locală.

De exemplu, astfel:

Referința la document a rămas într-un singur loc, ceea ce îmbunătățește imediat compresia:

(Aici și mai mult pentru compresie, ShrinkSafe este folosit, pentru că lasă traduceri liniare.
Rezultatele YUI sunt în esență aceleași)

De regulă, există numeroase apeluri către document în interfețe. și acestea sunt toate lungi, astfel încât această abordare poate reduce codul instantaneu cu 10-20%.

Funcțiile sunt declarate prin var. dar nu funcționează:

Acest lucru este necesar pentru ShrinkSafe, care comprimă numai definițiile (1). Pentru YUI - indiferent cum să declarați o funcție, comprimați și așa și așa mai departe.

Schema generală a facilităților din fabrică:

Frumusețea aici este că variabilele private sunt locale și, prin urmare, pot fi comprimate. În plus, eliminați suplimentar acest lucru.

Utilizarea maximă posibilă a variabilelor locale, de fapt, îmbunătățește minificarea. Și unele abordări din acest articol sunt doar ilustrații.

  • versiune tipărită