我正在使用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);
有没有办法防止这种情况发生?知道为什么要这样做吗?它是运行时性能提升吗?
感谢
答案 0 :(得分:2)
此行为记录在此处:
但是,当我添加一个值得进行重复数据删除的非常大的字符串时,我曾经避免使用的一种方法是将值包装在函数中:
const getCssStyleSheetText = () => "...";
并在需要文本时调用该函数。编译器在内联函数时使用不同的启发式算法,并且只有在估计它将减少代码大小时才会内联函数。因此,如果一个字符串被调用一次,那么返回一个字符串的函数将被内联,但如果它被多次调用则会被单独保留。
理想情况下,编译器在内联字符串方面会稍微有些细微差别,但总的来说,它所采用的方法效果还不错。