我正在查看我们的一些JavaScript压缩,并注意到没有对象属性名称的字符串被缩小为变量。
例如,假设我的脚本中有这两段代码:
alert("Wrong answer");
alert("Wrong answer buddy");
如果我没弄错的话,我们从YUI和Closure获得的缩小是:
alert("Wrong answer");alert("Wrong answer buddy")
;
我认为最终的缩小将如下所示:
var a="Wrong answer";alert(a);alert(a+" buddy");
是否有任何缩小工具可以执行此操作?是什么阻止了我们的工具呢?
答案 0 :(得分:8)
gzip压缩会将相同的字符串减少为一个或两个字节。使用它,这是一个非问题。 :)
答案 1 :(得分:2)
如果我冒险猜测,我会说这是因为编译器无法判断何时将字符串分解为变量并将其连接起来更为理想。 (而且,就这些事情而言,它首先属于微优化的标题。)
例如,以下代码:
if (test_case==="He fell down a well") {
var i=my_object_array.length-1;
while(i>=0) {
my_object_array[i].say("He fell down a well did he Lassie?");
i--;
}
}
可以由理论编译器重新呈现为:
var x="He fell down a well";
if (a===x) {
var i=b.length-1;
while(i>=0) {
b[i].say(x+" did he Lassie?");
i--;
}
}
...当然,增加 while
循环完成其工作所需的时间。
当然,稍微更智能的编译器可能会识别陷阱并进一步优化:
var x="He fell down a well";
var x1=x+" did he Lassie?";
if (a===x) {
var i=b.length-1;
while(i>=0) {
b[i].say(x1);
i--;
}
}
无论哪种方式,在我看来,一个好的javascript编译器首先针对性能优化代码,然后仅针对字符数进行优化。由于这是一个主要用于字符数改进的优化,我认为可能根本没有足够的需求来保证维护Closure和YUI压缩器的人的时间。
答案 2 :(得分:1)
压缩工具有其局限性,您找到了一个。您应该为字符串创建自己的变量,然后工具将压缩变量名称。
Eg
var msg_wrong = "Wrong answer",
msg_very_wrong = msg_wrong + "!!!";
alert (msg_wrong);
alert (msg_very_wrong);
// "msg_wrong" and "msg_very_wrong" variable names will be compressed