2010-07-01 3 views
15

Мне было интересно, какие отличия/преимущества пакера от мини-блока были, т. Е. Если вы развертываете упакованную или модифицированную версию в своем веб-приложении?javascript packer versus minifier

Пример кода:

var layout = { 

    NAVVISIBLE : 1, 

    Init : function() 
    { 
     this.Resize(); 
    }, 

    Dimensions : function() 
    { 
     var d = document, s = self, w, h; 
     if (s.innerHeight) 
     { w = s.innerWidth; h = s.innerHeight; } 
     else if (d.documentElement && d.documentElement.clientHeight) 
     { w = d.documentElement.clientWidth; h = d.documentElement.clientHeight; } 
     else if (d.body) 
     { w = d.body.clientWidth; h = d.body.clientHeight; } 
     return new Array(parseInt(w), parseInt(h)); 
    }, 

    Resize : function() 
    { 
     var dim = this.Dimensions(); 
     try 
     { 
      $('tbl_container').width = px(dim[0] - 25); 
      $('row_container').height = px(dim[1] - 100); 
      $('dat_container').width = px(dim[0] - (this.NAVVISIBLE ? 275 : 25)); 
      $('dat_container').height = px(dim[1] - 100); 
     } 
     catch(e) {} 
    }, 

    GoSideways : function() 
    { 
     var nc = $('nav_container'); 
     var dc = $('dat_container'); 
     nc.style.display = this.NAVVISIBLE ? 'none' : ''; 
     dc.width = px(parseInt(dc.width) + (this.NAVVISIBLE ? 250 : -250)); 
     this.NAVVISIBLE ^= 1; 
    }, 

    FrameLoad : function(url) 
    { 
     if (url) 
      content_frame.document.location = url; 
    } 
}; 

уменьшенная:

var layout={NAVVISIBLE:1,Init:function() 
{this.Resize();},Dimensions:function() 
{var d=document,s=self,w,h;if(s.innerHeight) 
{w=s.innerWidth;h=s.innerHeight;} 
else if(d.documentElement&&d.documentElement.clientHeight) 
{w=d.documentElement.clientWidth;h=d.documentElement.clientHeight;} 
else if(d.body) 
{w=d.body.clientWidth;h=d.body.clientHeight;} 
return new Array(parseInt(w),parseInt(h));},Resize:function() 
{var dim=this.Dimensions();try 
{$('tbl_container').width=px(dim[0]-25);$('row_container').height=px(dim[1]-100);$('dat_container').width=px(dim[0]-(this.NAVVISIBLE?275:25));$('dat_container').height=px(dim[1]-100);} 
catch(e){}},GoSideways:function() 
{var nc=$('nav_container');var dc=$('dat_container');nc.style.display=this.NAVVISIBLE?'none':'';dc.width=px(parseInt(dc.width)+(this.NAVVISIBLE?250:-250));this.NAVVISIBLE^=1;},FrameLoad:function(url) 
{if(url) 
content_frame.document.location=url;}}; 

упакованы:

eval(function(p,a,c,k,e,d){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--){d[e(c)]=k[c]||e(c)}k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--){if(k[c]){p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c])}}return p}('5 B={3:1,C:6(){2.n()},v:6(){5 d=k,s=y,w,h;9(s.u){w=s.A;h=s.u}r 9(d.a&&d.a.c){w=d.a.p;h=d.a.c}r 9(d.b){w=d.b.p;h=d.b.c}D z x(g(w),g(h))},n:6(){5 7=2.v();F{$(\'N\').8=4(7[0]-o);$(\'P\').m=4(7[1]-l);$(\'i\').8=4(7[0]-(2.3?E:o));$(\'i\').m=4(7[1]-l)}L(e){}},H:6(){5 t=$(\'I\');5 j=$(\'i\');t.J.G=2.3?\'Q\':\'\';j.8=4(g(j.8)+(2.3?q:-q));2.3^=1},M:6(f){9(f)O.k.K=f}};',53,53,'||this|NAVVISIBLE|px|var|function|dim|width|if|documentElement|body|clientHeight|||url|parseInt||dat_container|dc|document|100|height|Resize|25|clientWidth|250|else||nc|innerHeight|Dimensions||Array|self|new|innerWidth|layout|Init|return|275|try|display|GoSideways|nav_container|style|location|catch|FrameLoad|tbl_container|content_frame|row_container|none'.split('|'),0,{})) 
+1

Не забудьте [Компилятор Google Closure] (http://code.google.com/closure/compiler/) либо ... Есть много JS-библиотек, которые используют это для их сжатия, а не для минимизации или упаковки (jQuery использует это!). – gnarf

ответ

16

Упакованные меньше, но медленнее.

И еще труднее отлаживать.

Большинство известных фреймворков и плагинов только минимизированы.

Посмотрите на google minifier: http://code.google.com/intl/en-EN/closure/compiler/ Они предлагают плагин firebug для отладки мини-кода.

+1

[Компилятор Google Closure] (http://closure-compiler.appspot.com/home) часто создает большие файлы, чем [Microsoft Ajax Minifier] (http://sundgaard.dk/javascript-minify.aspx) из моего собственного опыта если вы не используете флаг ADVANCED_OPTIMIZATIONS, который, скорее всего, нарушит ваш код и не очень практичен в производстве. Я призываю людей использовать оба инструмента выше и использовать любой код меньше. – 10basetom

+0

@ 10basetom Почему бы не использовать оба вместе? Сначала GCC, а затем MAM. Инструмент Microsoft, похоже, удаляет еще несколько байтов из кода, созданного GCC. – tomasz86

1

В зависимости от упакованного кода упакованное решение ca приводит к ошибкам сценария, в то время как миниатюра будет работать.

Итак, проверьте различные браузеры после упаковки кода. Если он больше не работает, попробуйте мини-версию, которая всегда должна работать.

3

Целью является снижение размера JavaScript для быстрой загрузки в браузере клиента.

Минификатор удаляет ненужные вещи, такие как символы пробела, и переименование переменной до меньших имен, где это возможно. Но Packer идет еще на один шаг и делает все возможное, чтобы минимизировать размер JavaScript. Напр. он преобразует исходный код в Base62, сохраняя его сопоставления, которые будут оцениваться клиентом.

+2

Minifiers обычно переименовывают переменные. – mhenry1384

+0

Согласовано. Многие мини-экскаваторы также предоставляют возможность для этого. – IsmailS

14

Упаковщик делает больше, чем просто переименовывает вары и аргументы, он фактически отображает исходный код с помощью Base62, который затем должен быть перестроен на стороне клиента через eval(), чтобы он мог использоваться.

Сторона, наступающая на eval(), является злом, и это может также создать большой объем накладных расходов на клиенте во время загрузки страницы при запуске упаковки больших JS-библиотек, таких как jQuery. Вот почему рекомендуется делать только минирование на вашей продукции JS, потому что, если у вас достаточно кода для упаковки или минимизации, у вас достаточно кода, чтобы eval() захлопывал клиента во время загрузки страницы.

Для хорошего Minifier, я хотел бы посмотреть на использование Google, Closure Compiler http://code.google.com/closure/compiler/

Режим SIMPLE_OPTIMIZATIONS является то, что я рекомендовал бы использовать, так как она очищает пробельные/комментарии и munges (уменьшает) переменные. Он также выполняет некоторые простые изменения кода, которые в основном сводятся к очистке кода и микро оптимизации. Об этом вы можете узнать в Приступая к работе с приложением компилятора Closure или проверке упакованного README.

YUI Compressor - это еще один вариант (от Yahoo), но он не уменьшает размер файла столько, сколько делает CC. Существует также инструмент от Microsoft, имя ускользает от меня в данный момент, но, по-видимому, дает аналогичные результаты для CC. Это может быть лучшим или худшим вариантом, в зависимости от вашей среды. Я только читал об этом попутно, поэтому потребуется дальнейшее расследование.

0

«Пакер» - это то же, что и «минитор». Наиболее распространенным инструментом, который называет себя «упаковщиком», является http://dean.edwards.name/packer/, который дает опцию (по умолчанию отключена) для кодирования base62. Base62 кодировка, вероятно, плохая идея: https://stackoverflow.com/a/1351624/24267.

+1

Пакер - это не то же самое, что и мини-экскаватор. Packer требует, чтобы клиент «eval» и перестроил javascript до его использования. Таким образом, хотя пакер может сжимать материал лучше, чем мини-инструмент, он может быть медленнее. –

+2

Если у вас есть кодировка base62, отключенная в «упаковщике» Дина Эдвардса, для нее не требуется оценка на стороне клиента. По умолчанию он отключен. – mhenry1384

3

Если ваш сервер gzips файлы перед отправкой их в браузер (что очень часто бывает), то упаковщик не способ пойти. Я протестировал несколько файлов, и хотя упаковщик делает меньше файлов, чем мини-код, он делает большие файлы в формате zip. Хотя я не эксперт, я думаю, что причина довольно прямолинейна.

Большая часть застежки-молнии - это поиск повторяющихся последовательностей символов и замена их коротким держателем места, который будет распакован позже. Это то же самое, что делает упаковщик, за исключением того, что алгоритмы zip намного эффективнее. Поэтому, когда вы упаковываете файл, вы как бы предварительно закрепили его, но с алгоритмом, который менее эффективен, чем фактический zip-файл. Это делает меньше работы для алгоритма zip, с последующим уменьшением эффективности запечатывания.

Таким образом, если вы закрепили файлы, то упаковщик фактически произведет более крупные загрузки. Добавьте к этому дополнительные недостатки пакера, упомянутые в приведенных выше ответах, и нет действительно веских оснований для использования упаковщика.