JavaScript字符串文字的缩小?

6

我正在检查我们的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");

有没有任何缩小工具可以做到这一点?我们的工具为什么不能做到这一点?
3个回答

8

使用gzip压缩可以将相同的字符串压缩成1-2个字节,这样就不是问题了。:)


这对我来说听起来不准确。为什么gzip不将所有相同的字符串(例如变量名)缩减到一两个字节呢?对于gzip而言,“foobar”作为变量名与作为字符串文字并没有区别。 - CantSleepAgain
2
它确实会这样做;这就是我所说的“字符串”的意思。每当出现已经出现过的字节序列时,它都应该被缩减为只有几个字节。 - Dagg Nabbit
我还是不太明白你的意思。感谢您的耐心:)。假设我的JavaScript代码中有50个这样的代码:“Company.Search.Hash.update()”。如果我将其创建为一个变量(例如:“var hash = Company.Search.Hash;”)并在所有地方引用该变量(例如“hash.update()”)而不是使用“Company.Search.Hash.update()”,则JavaScript的压缩版本将更小... - CantSleepAgain
但你的意思是这并不重要吗?为了最小化优化而对 JavaScript 进行此更改没有意义,因为 "Company.Search.Hash.update()" 到处都会被替换为几个字节?那么如果 gzip 效果已经做到了这一点,为什么缩小器还要缩小变量名称呢? - CantSleepAgain
var hash=Company.Search.Hash 然后重复使用 hash 而不是重复使用 Company.Search.Hash 是一个好主意,因为它使您的代码更易于阅读(并且可能是一种微小的速度优化)。 除此之外,一旦 gzip 处理了它,就无关紧要了。 我假设缩小器只会费心缩小变量名称,因为 gzip 压缩并不总是可用的(一些共享主机不提供它)。 - Dagg Nabbit

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压缩器的维护人员投入时间。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接