ÐеÑед вÑкладÑванием JavaScript на «боевÑÑ» маÑÐ¸Ð½Ñ â пÑопÑÑкаем его ÑеÑез миниÑикаÑÐ¾Ñ (Ñакже говоÑÑÑ Â«ÑжимаÑелÑ»), коÑоÑÑй ÑдалÑÐµÑ Ð¿ÑÐ¾Ð±ÐµÐ»Ñ Ð¸ по-вÑÑÐºÐ¾Ð¼Ñ Ð¾Ð¿ÑимизиÑÑÐµÑ ÐºÐ¾Ð´, ÑменÑÑÐ°Ñ ÐµÐ³Ð¾ ÑазмеÑ.
Ð ÑÑой ÑÑаÑÑе Ð¼Ñ Ð¿Ð¾ÑмоÑÑим, как ÑабоÑаÑÑ ÑовÑеменнÑе миниÑикаÑоÑÑ, за ÑÑÑÑ Ñего они ÑкоÑаÑиваÑÑ ÐºÐ¾Ð´ и какие Ñ Ð½Ð¸Ð¼Ð¸ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ñ Ð¿ÑоблемÑ.
СовÑеменнÑе ÑжимаÑели
РаÑÑмаÑÑиваемÑе в ÑÑой ÑÑаÑÑе алгоÑиÑÐ¼Ñ Ð¸ Ð¿Ð¾Ð´Ñ Ð¾Ð´Ñ Ð¾ÑноÑÑÑÑÑ Ðº миниÑикаÑоÑам поÑледнего поколениÑ.
ÐÐ¾Ñ Ð¸Ñ ÑпиÑок:
СамÑе ÑиÑоко иÑполÑзÑемÑе â пеÑвÑе два, поÑÑÐ¾Ð¼Ñ Ð±Ñдем ÑаÑÑмаÑÑиваÑÑ Ð² пеÑвÑÑ Ð¾ÑеÑÐµÐ´Ñ Ð¸Ñ .
ÐаÑа ÑÐµÐ»Ñ â понÑÑÑ, как они ÑабоÑаÑÑ, и ÑÑо инÑеÑеÑного Ñ Ð¸Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ ÑоÑвоÑиÑÑ.
С Ñего наÑаÑÑ?
ÐÐ»Ñ GCC:
- УбедиÑÑÑÑ, ÑÑо ÑÑÐ¾Ð¸Ñ Java
- СкаÑаÑÑ Ð¸ ÑаÑпаковаÑÑ http://closure-compiler.googlecode.com/files/compiler-latest.zip, нам нÑжен Ñайл
compiler.jar. - СжаÑÑ Ñайл
my.js:java -jar compiler.jar --charset UTF-8 --js my.js --js_output_file my.min.js
ÐбÑаÑиÑе внимание на Ñлаг --charset Ð´Ð»Ñ GCC. Ðез него ÑÑÑÑкие бÑÐºÐ²Ñ Ð±ÑдÑÑ Ð·Ð°ÐºÐ¾Ð´Ð¸ÑÐ¾Ð²Ð°Ð½Ñ Ð²Ð¾ ÑÑо-Ñо Ñипа \u1234.
Google Closure Compiler Ñакже ÑодеÑÐ¶Ð¸Ñ Ð¿ÐµÑоÑниÑÑ Ð´Ð»Ñ ÑеÑÑиÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÑжаÑÐ¸Ñ Ð¸ веб-ÑеÑвиÑ, на коÑоÑÑй код можно оÑпÑавлÑÑÑ Ð´Ð»Ñ ÑжаÑиÑ. Ðо ÑкаÑаÑÑ Ñайл обÑÑно гоÑаздо пÑоÑе, поÑÑÐ¾Ð¼Ñ ÐµÐ³Ð¾ Ñедко где иÑполÑзÑÑÑ.
ÐÐ»Ñ UglifyJS:
- УбедиÑÑÑÑ, ÑÑо ÑÑÐ¾Ð¸Ñ Node.js
- ÐоÑÑавиÑÑ
npm install -g uglify-js. - СжаÑÑ Ñайл
my.js:uglifyjs my.js -o my.min.js
ЧÑо Ð´ÐµÐ»Ð°ÐµÑ Ð¼Ð¸Ð½Ð¸ÑикаÑоÑ?
ÐÑе ÑовÑеменнÑе миниÑикаÑоÑÑ ÑабоÑаÑÑ ÑледÑÑÑим обÑазом:
-
РазбиÑаÑÑ JavaScript-код в ÑинÑакÑиÑеÑкое деÑево.
Также поÑÑÑÐ¿Ð°ÐµÑ Ð»Ñбой инÑеÑпÑеÑаÑÐ¾Ñ JavaScript пеÑед Ñем, как его вÑполнÑÑÑ. Ðо заÑем, вмеÑÑо иÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÐºÐ¾Ð´Ð°â¦
-
ÐегаÑÑ Ð¿Ð¾ ÑÑÐ¾Ð¼Ñ Ð´ÐµÑевÑ, анализиÑÑÑÑ Ð¸ опÑимизиÑÑÑÑ ÐµÐ³Ð¾.
-
ÐапиÑÑваÑÑ Ð¸Ð· ÑинÑакÑиÑеÑкого деÑева полÑÑивÑийÑÑ ÐºÐ¾Ð´.
Ðак вÑглÑÐ´Ð¸Ñ Ð´ÐµÑево?
ÐоÑмоÑÑеÑÑ ÑинÑакÑиÑеÑкое деÑево можно, запÑÑÑив компилÑÑÐ¾Ñ Ñо ÑпеÑиалÑнÑм Ñлагом.
ÐÐ»Ñ GCC еÑÑÑ Ð´Ð°Ð¶Ðµ ÑпоÑоб вÑвеÑÑи его:
-
СнаÑала ÑгенеÑиÑÑем деÑево в ÑоÑмаÑе DOT:
java -jar compiler.jar --js my.js --use_only_custom_externs --print_tree >my.dotÐдеÑÑ Ñлаг
--print_treeвÑÐ²Ð¾Ð´Ð¸Ñ Ð´ÐµÑево, а--use_only_custom_externsÑбиÑÐ°ÐµÑ Ð»Ð¸ÑнÑÑ ÑлÑжебнÑÑ Ð¸Ð½ÑоÑмаÑиÑ. -
Файл в ÑÑом ÑоÑмаÑе иÑполÑзÑеÑÑÑ Ð² ÑазлиÑнÑÑ Ð¿ÑогÑÐ°Ð¼Ð¼Ð°Ñ Ð´Ð»Ñ Ð³ÑаÑопоÑÑÑоениÑ.
ЧÑÐ¾Ð±Ñ Ð¿ÑевÑаÑиÑÑ ÐµÐ³Ð¾ в обÑÑнÑÑ ÐºÐ°ÑÑинкÑ, подойдÑÑ ÑÑилиÑа
dotиз пакеÑа Graphviz:// конвеÑÑиÑоваÑÑ Ð² ÑоÑÐ¼Ð°Ñ png dot -Tpng my.dot -o my.png // конвеÑÑиÑоваÑÑ Ð² ÑоÑÐ¼Ð°Ñ svg dot -Tsvg my.dot -o my.svg
ÐÑÐ¸Ð¼ÐµÑ ÐºÐ¾Ð´Ð° my.js:
function User(name) {
this.sayHi = function() {
alert( name );
};
}
РезÑлÑÑаÑ, полÑÑивÑееÑÑ Ð¸Ð· my.js деÑево:
Ð ÑзлаÑ
-ÑллипÑаÑ
на иллÑÑÑÑаÑии вÑÑе ÑÑÐ¾Ð¸Ñ Ñип, напÑÐ¸Ð¼ÐµÑ FUNCTION (ÑÑнкÑиÑ) или NAME (Ð¸Ð¼Ñ Ð¿ÐµÑеменной). ÐомменÑаÑии к ним на ÑÑÑÑком ÑзÑке Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ñ Ð¼Ð½Ð¾Ð¹ вÑÑÑнÑÑ.
ÐÑоме него к ÐºÐ°Ð¶Ð´Ð¾Ð¼Ñ ÑÐ·Ð»Ñ Ð¿ÑивÑÐ·Ð°Ð½Ñ ÐºÐ¾Ð½ÐºÑеÑнÑе даннÑе. СжимаÑÐµÐ»Ñ ÑÐ¼ÐµÐµÑ Ñ Ð¾Ð´Ð¸ÑÑ Ð¿Ð¾ ÑÑÐ¾Ð¼Ñ Ð´ÐµÑÐµÐ²Ñ Ð¸ менÑÑÑ ÐµÐ³Ð¾, как пожелаеÑ.
ÐбÑÑно когда код пÑевÑаÑаеÑÑÑ Ð² деÑево â из него еÑÑеÑÑвеннÑм обÑазом иÑÑезаÑÑ ÐºÐ¾Ð¼Ð¼ÐµÐ½ÑаÑии и пÑобелÑ. Ðни не имеÑÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð¿Ñи вÑполнении, поÑÑÐ¾Ð¼Ñ Ð¸Ð³Ð½Ð¾ÑиÑÑÑÑÑÑ.
Ðо Google Closure Compiler добавлÑÐµÑ Ð² деÑево инÑоÑмаÑÐ¸Ñ Ð¸Ð· комменÑаÑиев JSDoc, Ñ.е. комменÑаÑиев вида /** ... */, напÑимеÑ:
/**
* ÐÐ¾Ð¼ÐµÑ Ð¼Ð¸Ð½Ð¸Ð¼Ð°Ð»Ñной поддеÑживаемой веÑÑии IE
* @const
* @type {number}
*/
var minIEVersion = 8;
Такие комменÑаÑии не ÑоздаÑÑ Ð½Ð¾Ð²ÑÑ
Ñзлов деÑева, а добавлÑÑÑÑÑ Ð² каÑеÑÑве инÑоÑмаÑии к ÑÑÑеÑÑвÑÑÑем. Рданном ÑлÑÑае â к пеÑеменной minIEVersion.
РниÑ
Ð¼Ð¾Ð¶ÐµÑ ÑодеÑжаÑÑÑÑ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¾ Ñипе пеÑеменной (number) и дÑÑгаÑ, коÑоÑÐ°Ñ Ð¿Ð¾Ð¼Ð¾Ð¶ÐµÑ ÑжимаÑÐµÐ»Ñ Ð»ÑÑÑе опÑимизиÑоваÑÑ ÐºÐ¾Ð´ (const â конÑÑанÑа).
ÐпÑимизаÑии
СжимаÑÐµÐ»Ñ Ð±ÐµÐ³Ð°ÐµÑ Ð¿Ð¾ деÑевÑ, иÑÐµÑ Â«Ð¿Ð°ÑÑеÑнÑ» â извеÑÑнÑе ÐµÐ¼Ñ ÑÑÑÑкÑÑÑÑ, коÑоÑÑе он знаеÑ, как опÑимизиÑоваÑÑ, и обновлÑÐµÑ Ð´ÐµÑево.
Ð ÑазнÑÑ Ð¼Ð¸Ð½Ð¸ÑикаÑоÑÐ°Ñ Ñеализован ÑазнÑй Ð½Ð°Ð±Ð¾Ñ Ð¾Ð¿ÑимизаÑий, Ñами опÑимизаÑии пÑименÑÑÑÑÑ Ð² Ñазном поÑÑдке, поÑÑÐ¾Ð¼Ñ ÑезÑлÑÑаÑÑ ÑабоÑÑ Ð¼Ð¾Ð³ÑÑ Ð¾ÑлиÑаÑÑÑÑ. РпÑимеÑÐ°Ñ Ð½Ð¸Ð¶Ðµ даÑÑÑÑ ÑезÑлÑÑÐ°Ñ ÑабоÑÑ GCC.
- ÐбÑединение и ÑжаÑие конÑÑанÑ
-
Ðо опÑимизаÑии:
function test(a, b) { run(a, 'my' + 'string', 600 * 600 * 5, 1 && 0, b && 0) }ÐоÑле:
function test(a,b){run(a,"mystring",18E5,0,b&&0)};
'my' + 'string'â"mystring".600 * 600 * 5â18E5(наÑÑÐ½Ð°Ñ ÑоÑма ÑиÑла, Ð´Ð»Ñ ÐºÑаÑкоÑÑи).1 && 0â0.b && 0â без изменений, Ñ.к. ÑезÑлÑÑÐ°Ñ Ð·Ð°Ð²Ð¸ÑÐ¸Ñ Ð¾Ñb.
- УкоÑаÑивание локалÑнÑÑ Ð¿ÐµÑеменнÑÑ
-
Ðо опÑимизаÑии:
function sayHi(name, message) { alert(name +" Ñказал: " + message); }ÐоÑле опÑимизаÑии:
function sayHi(a,b){alert(a+" Ñказал: "+b)};
- ÐокалÑÐ½Ð°Ñ Ð¿ÐµÑÐµÐ¼ÐµÐ½Ð½Ð°Ñ Ð·Ð°Ð²ÐµÐ´Ð¾Ð¼Ð¾ доÑÑÑпна ÑолÑко внÑÑÑи ÑÑнкÑии, поÑÑÐ¾Ð¼Ñ Ð¾Ð±ÑÑно ÐµÑ Ð¿ÐµÑеименование безопаÑно (необÑÑнÑе ÑлÑÑаи ÑаÑÑмоÑÑим далее).
- Также пеÑеименовÑваÑÑÑÑ Ð»Ð¾ÐºÐ°Ð»ÑнÑе ÑÑнкÑии.
- ÐложеннÑе ÑÑнкÑии обÑабаÑÑваÑÑÑÑ ÐºÐ¾ÑÑекÑно.
- ÐбÑединение и Ñдаление локалÑнÑÑ Ð¿ÐµÑеменнÑÑ
-
Ðо опÑимизаÑии:
function test(nodeId) { var elem = document.getElementsById(nodeId); var parent = elem.parentNode; alert( parent ); }ÐоÑле опÑимизаÑии GCC:
function test(a){a=document.getElementsById(a).parentNode;alert(a)};
- ÐокалÑнÑе пеÑеменнÑе бÑли пеÑеименованÑ.
- ÐиÑние пеÑеменнÑе ÑбÑанÑ. ÐÐ»Ñ ÑÑого ÑжимаÑÐµÐ»Ñ ÑоздаÑÑ Ð²ÑпомогаÑелÑнÑÑ Ð²Ð½ÑÑÑеннÑÑ ÑÑÑÑкÑÑÑÑ Ð´Ð°Ð½Ð½ÑÑ , в коÑоÑой Ñ ÑанÑÑÑÑ ÑÐ²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¾ «пÑÑи иÑполÑзованиÑ» каждой пеÑеменной. ÐÑли одна пеÑÐµÐ¼ÐµÐ½Ð½Ð°Ñ Ð·Ð°ÐºÐ°Ð½ÑÐ¸Ð²Ð°ÐµÑ Ñвой пÑÑÑ Ð¸ наÑÐ¸Ð½Ð°ÐµÑ Ð´ÑÑгаÑ, Ñо вполне можно даÑÑ Ð¸Ð¼ одно имÑ.
- ÐÑоме Ñого, опеÑаÑии
elem = getElementsByIdиelem.parentNodeобÑединенÑ, но ÑÑо Ñже дÑÑÐ³Ð°Ñ Ð¾Ð¿ÑимизаÑиÑ.
- УниÑÑожение недоÑÑижимого кода, ÑазвоÑаÑивание
if-веÑок -
Ðо опÑимизаÑии:
function test(node) { var parent = node.parentNode; if (0) { alert( "ÐÑÐ¸Ð²ÐµÑ Ñ Ð¿Ð°ÑаллелÑной планеÑÑ" ); } else { alert( "ÐÑÑанеÑÑÑ ÑолÑко один" ); } return; alert( 1 ); }ÐоÑле опÑимизаÑии:
function test(){alert("ÐÑÑанеÑÑÑ ÑолÑко один")}
-
ÐÑли пеÑÐµÐ¼ÐµÐ½Ð½Ð°Ñ Ð¿ÑиÑваиваеÑÑÑ, но не иÑполÑзÑеÑÑÑ, она Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ñдалена. РпÑимеÑе вÑÑе ÑÑа опÑимизаÑÐ¸Ñ Ð±Ñла пÑименена к пеÑеменной
parent, а заÑем и к паÑамеÑÑÑnode. -
Ðаведомо Ð»Ð¾Ð¶Ð½Ð°Ñ Ð²ÐµÑка
if(0) { .. }ÑбÑана, заведомо иÑÑÐ¸Ð½Ð½Ð°Ñ â оÑÑавлена.То же Ñамое бÑÐ´ÐµÑ Ñ ÑÑловиÑми в дÑÑÐ³Ð¸Ñ ÐºÐ¾Ð½ÑÑÑÑкÑиÑÑ , напÑимеÑ
a = true ? c : dпÑевÑаÑиÑÑÑ Ð²a = c. -
Ðод поÑле
returnÑдалÑн как недоÑÑижимÑй.
- ÐеÑепиÑÑвание ÑинÑакÑиÑеÑÐºÐ¸Ñ ÐºÐ¾Ð½ÑÑÑÑкÑий
-
Ðо опÑимизаÑии:
var i = 0; while (i++ < 10) { alert( i ); } if (i) { alert( i ); } if (i == '1') { alert( 1 ); } else if (i == '2') { alert( 2 ); } else { alert( i ); }ÐоÑле опÑимизаÑии:
for(var i=0;10>i++;)alert(i);i&&alert(i);"1"==i?alert(1):"2"==i?alert(2):alert(i);
- ÐонÑÑÑÑкÑиÑ
whileпеÑепиÑана вfor. - ÐонÑÑÑÑкÑиÑ
if (i) ...пеÑепиÑана вi&&.... - ÐонÑÑÑÑкÑиÑ
if (cond) ... else ...бÑла пеÑепиÑана вcond ? ... : ....
- Ðнлайнинг ÑÑнкÑий
-
Ðнлайнинг ÑÑнкÑии â пÑиÑм опÑимизаÑии, пÑи коÑоÑом ÑÑнкÑÐ¸Ñ Ð·Ð°Ð¼ÐµÐ½ÑеÑÑÑ Ð½Ð° ÑÐ²Ð¾Ñ Ñело.
Ðо опÑимизаÑии:
function sayHi(message) { var elem = createMessage('div', message); showElement(elem); function createMessage(tagName, message) { var el = document.createElement(tagName); el.innerHTML = message; return el; } function showElement(elem) { document.body.appendChild(elem); } }ÐоÑле опÑимизаÑии (пеÑÐµÐ²Ð¾Ð´Ñ ÑÑÑок Ñакже бÑдÑÑ ÑбÑанÑ):
function sayHi(b) { var a = document.createElement("div"); a.innerHTML = b; document.body.appendChild(a) };
- ÐÑÐ·Ð¾Ð²Ñ ÑÑнкÑий
createMessageиshowElementÐ·Ð°Ð¼ÐµÐ½ÐµÐ½Ñ Ð½Ð° Ñело ÑÑнкÑий. Рданном ÑлÑÑае ÑÑо возможно, Ñак как ÑÑнкÑии иÑполÑзÑÑÑÑÑ Ð²Ñего по ÑазÑ. - ÐÑа опÑимизаÑÐ¸Ñ Ð¿ÑименÑеÑÑÑ Ð½Ðµ вÑегда. ÐÑли Ð±Ñ ÐºÐ°Ð¶Ð´Ð°Ñ ÑÑнкÑÐ¸Ñ Ð¸ÑполÑзовалаÑÑ Ð¼Ð½Ð¾Ð³Ð¾ Ñаз, Ñо Ñ ÑоÑки зÑÐµÐ½Ð¸Ñ ÑазмеÑа вÑгоднее оÑÑавиÑÑ Ð¸Ñ Â«ÐºÐ°Ðº еÑÑÑ».
- Ðнлайнинг пеÑеменнÑÑ
-
ÐеÑеменнÑе заменÑÑÑÑÑ Ð½Ð° знаÑение, еÑли оно заведомо извеÑÑно.
Ðо опÑимизаÑии:
(function() { var isVisible = true; var hi = "ÐÑÐ¸Ð²ÐµÑ Ð²Ð°Ð¼ из JavaScript"; window.sayHi = function() { if (isVisible) { alert( hi ); alert( hi ); alert( hi ); alert( hi ); alert( hi ); alert( hi ); alert( hi ); alert( hi ); alert( hi ); alert( hi ); alert( hi ); alert( hi ); } } })();ÐоÑле опÑимизаÑии:
(function() { window.sayHi = function() { alert( "ÐÑÐ¸Ð²ÐµÑ Ð²Ð°Ð¼ из JavaScript" ); alert( "ÐÑÐ¸Ð²ÐµÑ Ð²Ð°Ð¼ из JavaScript" ); alert( "ÐÑÐ¸Ð²ÐµÑ Ð²Ð°Ð¼ из JavaScript" ); alert( "ÐÑÐ¸Ð²ÐµÑ Ð²Ð°Ð¼ из JavaScript" ); alert( "ÐÑÐ¸Ð²ÐµÑ Ð²Ð°Ð¼ из JavaScript" ); alert( "ÐÑÐ¸Ð²ÐµÑ Ð²Ð°Ð¼ из JavaScript" ); alert( "ÐÑÐ¸Ð²ÐµÑ Ð²Ð°Ð¼ из JavaScript" ); alert( "ÐÑÐ¸Ð²ÐµÑ Ð²Ð°Ð¼ из JavaScript" ); alert( "ÐÑÐ¸Ð²ÐµÑ Ð²Ð°Ð¼ из JavaScript" ); alert( "ÐÑÐ¸Ð²ÐµÑ Ð²Ð°Ð¼ из JavaScript" ); alert( "ÐÑÐ¸Ð²ÐµÑ Ð²Ð°Ð¼ из JavaScript" ); alert( "ÐÑÐ¸Ð²ÐµÑ Ð²Ð°Ð¼ из JavaScript" ); }; } })();-
ÐеÑеменнаÑ
isVisibleзаменена наtrue, поÑле ÑегоifÑÑало возможнÑм ÑбÑаÑÑ. -
ÐеÑеменнаÑ
hiзаменена на ÑÑÑокÑ.ÐазалоÑÑ Ð±Ñ â заÑем менÑÑÑ
hiна ÑÑÑокÑ? ÐÐµÐ´Ñ ÐºÐ¾Ð´ ÑÑал оÑÑÑимо длиннее!â¦Ðо вÑÑ Ð´ÐµÐ»Ð¾ в Ñом, ÑÑо миниÑикаÑÐ¾Ñ Ð·Ð½Ð°ÐµÑ, ÑÑо далÑÑе код бÑÐ´ÐµÑ ÑжимаÑÑÑÑ Ð¿Ñи помоÑи gzip. Ðо вÑÑком ÑлÑÑае, вÑе пÑавилÑно наÑÑÑоеннÑе ÑеÑвеÑа Ñак делаÑÑ.
-
ÐлгоÑиÑм ÑабоÑÑ gzip заклÑÑаеÑÑÑ Ð² Ñом, ÑÑо он иÑÐµÑ Ð¿Ð¾Ð²ÑоÑÑ Ð² даннÑÑ Ð¸ вÑноÑÐ¸Ñ Ð¸Ñ Ð² ÑпеÑиалÑнÑй «ÑловаÑÑ», заменÑÑ Ð½Ð° более коÑоÑкий иденÑиÑикаÑоÑ. ÐÑÑ Ð¸Ð² как Ñаз и ÑоÑÑÐ¾Ð¸Ñ Ð¸Ð· ÑловаÑÑ Ð¸ даннÑÑ , в коÑоÑÑÑ Ð´ÑбликаÑÑ Ð·Ð°Ð¼ÐµÐ½ÐµÐ½Ñ Ð½Ð° иденÑиÑикаÑоÑÑ.
ÐÑли вÑнеÑÑи ÑÑÑÐ¾ÐºÑ Ð¾Ð±ÑаÑно в пеÑеменнÑÑ, Ñо полÑÑиÑÑÑ ÐºÐ°Ðº Ñаз ÑаÑÑнÑй ÑлÑÑай Ñакого ÑжаÑÐ¸Ñ â взÑли "ÐÑÐ¸Ð²ÐµÑ Ð²Ð°Ð¼ из JavaScript" и заменили на иденÑиÑикаÑÐ¾Ñ hi. Ðо gzip ÑпÑавлÑеÑÑÑ Ñ ÑÑим лÑÑÑе, поÑÑÐ¾Ð¼Ñ ÑÑÑекÑивнее бÑÐ´ÐµÑ Ð¾ÑÑавиÑÑ Ð¸Ð¼ÐµÐ½Ð½Ð¾ ÑÑÑокÑ. Gzip Ñам найдÑÑ Ð´ÑбликаÑÑ Ð¸ ÑожмÑÑ Ð¸Ñ
.
ÐлÑÑ Ñакого Ð¿Ð¾Ð´Ñ Ð¾Ð´Ð° ÑÑÐ°Ð½ÐµÑ Ð¾Ñевиден, еÑли ÑжаÑÑ gzip оба кода â до и поÑле миниÑикаÑии. ÐиниÑиÑиÑованнÑй gzip-ÑжаÑÑй код в иÑоге даÑÑ Ð¼ÐµÐ½ÑÑий ÑазмеÑ.
- РазнÑе мелкие опÑимизаÑии
- ÐÑоме оÑновнÑÑ Ð¾Ð¿ÑимизаÑий, опиÑаннÑÑ Ð²ÑÑе, еÑÑÑ ÐµÑÑ Ð¼Ð½Ð¾Ð³Ð¾ Ð¼ÐµÐ»ÐºÐ¸Ñ :
- УбиÑаÑÑÑÑ Ð»Ð¸Ñние кавÑÑки Ñ ÐºÐ»ÑÑей
{"prop" : "val" } => {prop:"val"}
- УпÑоÑаÑÑÑÑ Ð¿ÑоÑÑÑе вÑзовÑ
Array/Object
a = new Array() => a = []
o = new Object() => o = {}
ÐÑа опÑимизаÑÐ¸Ñ Ð¿ÑедполагаеÑ, ÑÑо `Array` и `Object` не пеÑеопÑÐµÐ´ÐµÐ»ÐµÐ½Ñ Ð¿ÑогÑаммиÑÑом. ÐÐ»Ñ Ð²ÐºÐ»ÑÑÐµÐ½Ð¸Ñ ÐµÑ Ð² UglifyJS нÑжен Ñлаг `--unsafe`.
- â¦Ð еÑÑ Ð½ÐµÐºÐ¾ÑоÑÑе дÑÑгие мелкие Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ ÐºÐ¾Ð´Ð°â¦
ÐодводнÑе камни
ÐпиÑаннÑе опÑимизаÑии, в Ñелом, безопаÑнÑ, но еÑÑÑ ÑÑд подводнÑÑ ÐºÐ°Ð¼Ð½ÐµÐ¹.
ÐонÑÑÑÑкÑÐ¸Ñ with
РаÑÑмоÑÑим код:
function changePosition(style) {
var position, test;
with (style) {
position = 'absolute';
}
}
ÐÑда бÑÐ´ÐµÑ Ð¿ÑиÑвоено знаÑение position = 'absolute'?
ÐÑо неизвеÑÑно до моменÑа вÑполнениÑ: еÑли ÑвойÑÑво position еÑÑÑ Ð² style â Ñо ÑÑда, а еÑли Ð½ÐµÑ â Ñо в локалÑнÑÑ Ð¿ÐµÑеменнÑÑ.
Ðожно ли в Ñакой ÑиÑÑаÑии замениÑÑ Ð»Ð¾ÐºÐ°Ð»ÑнÑÑ Ð¿ÐµÑеменнÑÑ Ð½Ð° более коÑоÑкÑÑ? ÐÑевидно, неÑ:
function changePosition(style) {
var a, b;
with (style) { // а ÑÑо, еÑли в style Ð½ÐµÑ Ñакого ÑвойÑÑва?
position = 'absolute';// кÑда бÑÐ´ÐµÑ Ð¾ÑÑÑеÑÑвлена запиÑÑ? в window.position?
}
}
Ð¢Ð°ÐºÐ°Ñ Ð¶Ðµ опаÑноÑÑÑ Ð´Ð»Ñ ÑжаÑÐ¸Ñ ÐºÑоеÑÑÑ Ð² иÑполÑзованном eval. ÐÐµÐ´Ñ eval Ð¼Ð¾Ð¶ÐµÑ Ð¾Ð±ÑаÑаÑÑÑÑ Ðº локалÑнÑм пеÑеменнÑм:
function f(code) {
var myVar;
eval(code); // а ÑÑо, еÑли бÑÐ´ÐµÑ Ð¿ÑиÑвоение eval("myVar = ...") ?
alert(myVar);
ÐолÑÑаеÑÑÑ, ÑÑо пÑи налиÑии eval Ð¼Ñ Ð½Ðµ имеем пÑава пеÑеименовÑваÑÑ Ð»Ð¾ÐºÐ°Ð»ÑнÑе пеÑеменнÑе. ÐÑиÑÑм (!), еÑли ÑÑнкÑÐ¸Ñ ÑвлÑеÑÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ð¾Ð¹, Ñо и во внеÑниÑ
ÑÑнкÑиÑÑ
Ñоже.
Ð Ð²ÐµÐ´Ñ ÑжаÑие пеÑеменнÑÑ â оÑÐµÐ½Ñ Ð²Ð°Ð¶Ð½Ð°Ñ Ð¾Ð¿ÑимизаÑиÑ. Ðак пÑавило, она ÑменÑÑÐ°ÐµÑ ÑÐ°Ð·Ð¼ÐµÑ ÑилÑнее вÑего.
ЧÑо делаÑÑ? РазнÑе миниÑикаÑоÑÑ Ð¿Ð¾ÑÑÑпаÑÑ Ð¿Ð¾-ÑазномÑ.
- UglifyJS â не бÑÐ´ÐµÑ Ð¿ÐµÑеименовÑваÑÑ Ð¿ÐµÑеменнÑе. Так ÑÑо налиÑие
with/evalÑилÑно повлиÑÐµÑ Ð½Ð° ÑÑÐµÐ¿ÐµÐ½Ñ ÑжаÑие кода. - GCC â вÑÑ Ñавно ÑожмÑÑ Ð»Ð¾ÐºÐ°Ð»ÑнÑе пеÑеменнÑе. ÐÑо, конеÑно же, Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑивеÑÑи к оÑибкам, пÑиÑÑм в ÑжаÑом коде, оÑлаживаÑÑ ÐºÐ¾ÑоÑÑй не оÑенÑ-Ñо Ñдобно. ÐоÑÑÐ¾Ð¼Ñ Ð¾Ð½ вÑдаÑÑ Ð¿ÑедÑпÑеждение о налиÑии опаÑной конÑÑÑÑкÑии.
Ðи ÑÐ¾Ñ Ð½Ð¸ дÑÑгой ваÑÐ¸Ð°Ð½Ñ Ð½Ð°Ñ, по болÑÑÐ¾Ð¼Ñ ÑÑÑÑÑ, не ÑÑÑÑаиваÑÑ.
ÐÐ»Ñ Ñого, ÑÑÐ¾Ð±Ñ ÐºÐ¾Ð´ ÑжималÑÑ Ñ
оÑоÑо и ÑабоÑал пÑавилÑно, не иÑполÑзÑем with и eval.
Ðибо, еÑли Ñж оÑÐµÐ½Ñ Ð½Ð°Ð´Ð¾ иÑполÑзоваÑÑ â делаем ÑÑо Ñ Ð¾Ð³Ð»Ñдкой на поведение миниÑикаÑоÑа, ÑÑÐ¾Ð±Ñ Ð½Ðµ бÑло пÑоблем.
УÑÐ»Ð¾Ð²Ð½Ð°Ñ ÐºÐ¾Ð¼Ð¿Ð¸Ð»ÑÑÐ¸Ñ IE10-
Ð IE10- поддеÑживалоÑÑ ÑÑловное вÑполнение JavaScript.
СинÑакÑиÑ: /*@cc_on код */.
Такой код вÑполниÑÑÑ Ð² IE10-, напÑимеÑ:
var isIE /*@cc_on =true@*/ ;
alert( isIE ); // true в IE10-
Ðожно Ñ Ð¸ÑÑо ÑделаÑÑ, ÑÑÐ¾Ð±Ñ ÐºÐ¾Ð¼Ð¼ÐµÐ½ÑаÑий оÑÑалÑÑ, напÑÐ¸Ð¼ÐµÑ Ñак:
var isIE = new Function('', '/*@cc_on return true@*/')();
alert( isIE ); // true в IE.
â¦Ðднако, Ñ ÑÑÑÑом Ñого, ÑÑо в ÑовÑеменнÑÑ IE11+ ÑÑа компилÑÑÐ¸Ñ Ð½Ðµ ÑабоÑÐ°ÐµÑ Ð² лÑбом ÑлÑÑае, лÑÑÑе избавиÑÑÑÑ Ð¾Ñ Ð½ÐµÑ Ð²Ð¾Ð¾Ð±Ñе.
Ð ÑледÑÑÑÐ¸Ñ Ð³Ð»Ð°Ð²Ð°Ñ Ð¼Ñ Ð¿Ð¾ÑмоÑÑим, какие пÑодвинÑÑÑе возможноÑÑи еÑÑÑ Ð² миниÑикаÑоÑÐ°Ñ , как ÑделаÑÑ ÑжаÑие более ÑÑÑекÑивнÑм.
ÐомменÑаÑии
<code>, Ð´Ð»Ñ Ð½ÐµÑколÑÐºÐ¸Ñ ÑÑÑок кода — Ñег<pre>, еÑли болÑÑе 10 ÑÑÑок — ÑÑÑÐ»ÐºÑ Ð½Ð° пеÑоÑниÑÑ (plnkr, JSBin, codepenâ¦)