Pull to refresh

YUICompressor — улучшаем сжатие

Reading time 2 min
Views 2.4K
Немного прооптимизировав код своей библиотеки, я вдруг заметил что она стала на порядок хуже сжиматься. Для сжатия использую YUICompressor. Твердая уверенность в том что оптимизация все же должна пойти на благо, а не во вред, я решил разобраться в чем же дело. И вот что оказывается: YUICompressor плохо переваривает window.eval внутри (function(){...})(). Теперь пример плохой сжимаемости:

(function(){
  var TOPLONGNAME = 'a';
  var obj = {
   test: function(){ 
     var LOCALLONGNAME = 'b';
     var res = window.eval(function(){
       alert(TOPLONGNAME + LOCALLONGNAME);   
     });
     res();
   }
  }
  obj.test();
})()


после сжатия

(function(){var TOPLONGNAME=«a»;var obj={test:function(){var LOCALLONGNAME=«b»;var res=window.eval(function(){alert(TOPLONGNAME+LOCALLONGNAME)});res()}};obj.test()})();


как видим переменные TOPLONGNAME и LOCALLONGNAME не прооптимизированы.

Как это победить? Очень просто! Замените window.eval на window['eval'].
Пример:

(function(){
  var TOPLONGNAME = 'a';
  var obj = {
   test: function(){ 
     var LOCALLONGNAME = 'b';
     var res = window['eval'](function(){
       alert(TOPLONGNAME + LOCALLONGNAME);   
     });
     res();
   }
  }
  obj.test();
})()


После сжатия:

(function(){var A=«a»;var B={test:function(){var D=«b»;var C=window[«eval»](function(){alert(A+D)});C()}};B.test()})();


Может кому пригодится… В любом случае, я отписал разработчику YUICompressor о даной баге, ждем исправления.
Tags:
Hubs:
+8
Comments 13
Comments Comments 13

Articles