我正在使用Google Closure Compiler测试一些代码并进行简单的优化,令我惊讶的是一个函数,例如:
window.navigator.detect = function() {
var t = this,
a = t.userAgent.toLowerCase(),
match = /(chrome|webkit|firefox|msie)[ \/]([\w.]+)/.exec(a) ||
/(opera)(?:.*version|)[ \/]([\w.]+)/.exec(a) ||
a.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(a) || [];
t.ua = match[1] || false;
t.vers = match[2] || "0";
if (t.ua) t[match[1]] = true;
if (match = t.msie)
t.ie = parseInt(t.vers);//ie main version or false if not IE
else if (t.chrome)
t.webkit = true;
else if (t.webkit)
t.safari = true;
//css prefix
t.pre = t.webkit ? '-webkit-' : t.firefox ? '-moz-' : t.ie > 7 ? '-ms-' : t.opera ? '-o-' : '';
}
window.navigator.detect();
变成:
window.navigator.detect = function() {
var a = this.userAgent.toLowerCase(), a = /(chrome|webkit|firefox|msie)[ \/]([\w.]+)/.exec(a) || /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(a) || 0 > a.indexOf("compatible") && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(a) || [];
this.ua = a[1] || !1;
this.vers = a[2] || "0";
this.ua && (this[a[1]] = !0);
this.msie ? this.ie = parseInt(this.vers) : this.chrome ? this.webkit = !0 : this.webkit && (this.safari = !0);
this.pre = this.webkit ? "-webkit-" : this.firefox ? "-moz-" : 7 < this.ie ? "-ms-" : this.opera ? "-o-" : ""
};
window.navigator.detect();
我想使用较小的't'变量作为'this'的引用来保存一些字节而不是更长的'this'使用17次。在这种情况下,Closure Compiler使我的代码更长,这有点讽刺。不确定这是否有意。我没有在Google的文档中看到任何相关内容。
任何想法如何防止这种警告?
答案 0 :(得分:1)
我自己发现了一些谷歌搜索... 答案类似于关于Closure Compiler内联字符串的问题:Variables in Google Closure
FAQ上的这个难题:
“ Closure Compiler内联我的所有字符串,这使我的代码大小 大。为什么会这样做?大多数人通过查看来比较代码大小 在两个未压缩的JavaScript文件中。但这是一种误导性的方式 查看代码大小,因为不应该提供JavaScript文件 解压缩。应该使用gzip压缩。“...”gzip 算法的工作原理是尝试在最优的位置对字节序列进行别名 办法。手动别名字符串几乎总是产生压缩代码 大小更大,因为它颠覆了gzip自己的别名算法。“
我尝试使用:window.navigator.detect(window.navigator);
然后window.navigator.detect = function(t){}
传递't'var作为函数参数,它保留一个简短的1字符变量。但是虽然它在'Compiled Size'上节省了27个字节,但'gzipped size'实际上更大了1个字节......
因此虽然这里并不完全是关于字符串的别名,但gzip的最终结果是相似的,并且应该是减小尺寸的主要问题。