【问题标题】:JavaScript minification of string literals?字符串文字的JavaScript缩小?
【发布时间】:2010-07-21 03:19:36
【问题描述】:

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

是否有任何缩小工具可以做到这一点?是什么阻止我们的工具这样做?

【问题讨论】:

    标签: javascript minify


    【解决方案1】:

    gzip 压缩会将相同的字符串减少到一两个字节。使用它,这不是问题。 :)

    【讨论】:

    • 这对我来说听起来不太准确。那么为什么 gzip 不将所有相同的字符串(例如变量名称)也减少到一两个字节呢?对于 gzip,“foobar”作为变量名与“foobar”作为字符串文字没有什么不同。
    • 确实这样做了;这就是我所说的“字符串”。任何时候出现已经发生的字节序列,它都应该减少到几个字节。
    • 我还没关注你。感谢您的耐心等待:)。假设我的 JavaScript 中有 50 次这样的代码:“Company.Search.Hash.update()”。如果我要从中创建一个变量(例如:“var hash=Company.Search.Hash;”)并在任何地方引用该变量(例如“hash.update()”)而不是使用“Company.Search.Hash. update()",缩小版的 JavaScript 会更小...
    • ...但你是说这根本不重要?对 JavaScript 进行这种更改以进行缩小优化是没有意义的,因为无论如何“Company.Search.Hash.update()”都会被替换为几个字节?如果 gzip 能有效地做到这一点,为什么缩小器还要费心缩小变量名呢?
    • var hash=Company.Search.Hash 然后重复 hash 而不是重复 Company.Search.Hash 是个好主意,因为它使您的代码更易于阅读(而且它可能是 tiny 速度优化)。除此之外,一旦 gzip 掌握了它,就没有关系了。我假设缩小器只会费心缩小变量名,因为 gzip 压缩并不总是可用(一些共享主机不提供它)。
    【解决方案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 压缩器的人们的时间。

    【讨论】:

      【解决方案3】:

      压缩工具有其局限性,您找到了。您应该为字符串创建自己的变量,然后工具将压缩变量名称。

      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
      

      【讨论】:

        猜你喜欢
        • 2017-10-15
        • 1970-01-01
        • 1970-01-01
        • 2019-03-24
        • 1970-01-01
        • 1970-01-01
        • 2020-06-12
        • 1970-01-01
        相关资源
        最近更新 更多