【问题标题】:What techniques do JavaScript compression libraries use to minimize file size?JavaScript 压缩库使用哪些技术来最小化文件大小?
【发布时间】:2009-04-08 13:24:24
【问题描述】:

请注意,这个问题的目的是在主题的理论方面多一点,但除了去除空格之外,JavaScript Compression 还使用了哪些其他技术?

【问题讨论】:

    标签: javascript optimization theory


    【解决方案1】:

    大多数压缩器使用不同技术的组合:

    • 去除空格
    • 通过压缩算法(gzip、deflate)压缩文件
    • 大部分空间用于将内部变量和函数重命名为更短的名称,例如:

    这个函数:

    function func (variable) {
      var temp = 2 * variable;
      return temp;
    }
    

    会变成:

    function func (a) {
      var b = 2 * a;
      return b;
    }
    
    • Dean Edwards packer 使用了一些内部压缩。脚本在页面加载时会被解压。
    • 所有使程序代码更短的常用材料:
      • 删除未使用的代码
      • 函数内联

    【讨论】:

    • 将变为:函数 f(a){return 2*a;} ;) 从 72 个字符减少到 27 个
    • 如果你想在全局 javascript 范围内使用 func 我会保持原样...... ;-)
    【解决方案2】:

    在我的头顶...

    • 标记局部变量,然后将它们重命名为最小大小的变量。
    • 删除大量空白。
    • 删除不必要的大括号(例如,if 语句后的单行执行可以删除大括号并添加单个分号)。
    • 删除不必要的分号(例如,在结束大括号“}”之前)。

    我最常用的缩小器是YUI Compressoras they state,它是开源的,所以你可以自己看看它们到底做了什么。 (我不确定他们所说的“微优化”是什么意思,可能是一堆罕见的情况,可以让你获得一两个角色。)

    【讨论】:

      【解决方案3】:

      代码重命名和重新排序,以便 gzip 压缩器有更好的结果。

      例如(不太聪明)

      原代码:

      function mul(mul1, mul2)
      {
       return mul1 * mul2;
      }
      
      function print(str)
      {
        // do something 
      }
      
      function add(add1, add2)
      {
       return add1 + add2;
      }
      

      修改代码:

      function mul(a,b)
      {
       return a * b;
      }
      
      function add(a, b)
      {
       return a + b;
      }
      
      function print(str)
      {
        // do something 
      }
      

      【讨论】:

      • 我不赞成这个答案,因为你没有真正回答这个问题,即正在使用什么技术
      • 抱歉,Rob,我没有阅读整个问题。新答案,希望这次我做得更好:)
      • 这只是一个示例,当然您可以只执行不会影响结果的操作。
      【解决方案4】:

      我可以列举一些在 Google Web Toolkit 编译器中找到的:

      • 内联方法调用
      • 死代码消除
      • 变量重命名/源混淆
        • 这意味着将长变量重写为短变量等等

      几乎所有这些都需要 Javascript 解析(即它们的工作超出了纯粹的词法分析)。

      【讨论】:

      • 死代码部分吓到我了,当 JS 具有全局作用域时,GWT 怎么知道代码死了?还是 GWT 是为一次编译所有 JS 而设计的,如果只在多个 JS 文件中的一个上执行它就不起作用?
      • GWT 是一个单片编译器,因此通过对您在 java 中可以执行的操作添加一些限制,它可以准确地确定是否调用了某个方法(类似于您可以使用 eclipse ide 执行的操作)。
      猜你喜欢
      • 2010-10-10
      • 1970-01-01
      • 2010-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-19
      相关资源
      最近更新 更多