防止Closure编译器重复字符串

时间:2011-11-09 05:36:48

标签: javascript google-closure-compiler

我正在使用Google的Closure编译器缩小我的JS。我的代码中有几个地方有重复的字符串,例如

(function($){


$('.bat').append('<p>the red car has a fantastically wonderfully awe inspiringly world class engine</p><p>the blue car has a fantastically wonderfully awe inspiringly world class stereo</p><p>the green car has a fantastically wonderfully awe inspiringly world class horn</p>')

})(jQuery);

编译器没有尽量减少冗余(预期),所以我自己在'预编译'代码中做到了:

(function($){

   var ch = ' car has a fantastically wonderfully awe inspiringly world class ';
   $('.bat').append('<p>the red'+ch+'engine</p><p>the blue'+ch+'stereo</p><p>the green'+ch+'horn</p>')

})(jQuery);

但是当我通过编译器运行它时,它会反转我的压缩,这会导致更多的字符。它输出:

(function(a){a(".bat").append("<p>the red car has a fantastically wonderfully awe inspiringly world class engine</p><p>the blue car has a fantastically wonderfully awe inspiringly world class stereo</p><p>the green car has a fantastically wonderfully awe inspiringly world class horn</p>")})(jQuery);

有没有办法防止这种情况发生?知道为什么要这样做吗?它是运行时性能提升吗?

感谢

1 个答案:

答案 0 :(得分:2)

此行为记录在此处:

http://code.google.com/p/closure-compiler/wiki/FAQ#Closure_Compiler_inlined_all_my_strings,_which_made_my_code_size

但是,当我添加一个值得进行重复数据删除的非常大的字符串时,我曾经避免使用的一种方法是将值包装在函数中:

const getCssStyleSheetText = () => "...";

并在需要文本时调用该函数。编译器在内联函数时使用不同的启发式算法,并且只有在估计它将减少代码大小时才会内联函数。因此,如果一个字符串被调用一次,那么返回一个字符串的函数将被内联,但如果它被多次调用则会被单独保留。

理想情况下,编译器在内联字符串方面会稍微有些细微差别,但总的来说,它所采用的方法效果还不错。