【问题标题】:ADVANCED_OPTIMIZATION without renaming无需重命名的高级优化
【发布时间】:2011-03-10 20:56:59
【问题描述】:

我正在 Google 闭包编译器的帮助下编写 Google Chrome 扩展程序。 我大量使用消息 API 在不同进程上运行的代码之间进行通信。这就是为什么我的文件需要单独编译的原因。如果我使用高级优化,我还必须在使用此消息 API 发送的数据中使用带引号的字符串访问属性。这没有问题,但它让我的代码看起来很难看。但我喜欢高级优化带来的死代码删除。

我希望能够在不进行高级优化带来的重命名的情况下删除死代码。闭包编译器可以做到这一点吗?

【问题讨论】:

    标签: javascript google-closure-compiler


    【解决方案1】:

    它是not possible out of the box,但是您可以下载源代码并使用 Java 自己进行自定义。

    【讨论】:

      【解决方案2】:

      是的,我同意。在处理数据传递的所有代码中必须使用obj["prop"] 而不是obj.prop 只是为了在高级模式下使用闭包编译器,这是很难看的。

      我开发的一个技巧是构建一个映射对象:

      var mapping = {
        field1: "field1",
        field2: "field2"
          :
      };
      

      这个对象,在被闭包编译器编译后,将有字段名称被修改(重命名)映射到原始的、未修改的名称,例如:

      var a = {
         b: "field1",
         c: "field2"
            :
      };
      

      然后在我发送数据之前,我将它传递给一个克隆整个数据结构的函数,在传递 new 对象之前将每个损坏的字段名称转换为新对象中的未损坏版本:

      function cloneData(obj) {
          var newobj = {};
          foreach (var name in obj) {
              if (!obj.hasOwnProperty(name)) continue;
              var fullname = mapping[name] || name;
              newobj[fullname] = obj[name];
          }
          return newobj;
      }
      

      对于收到的数据,做相反的事情。

      【讨论】:

      • 不错的把戏。我做了类似的事情。虽然过了一段时间我决定放弃 Closure 以支持普通的旧 javascript。我只是为 Chrome (chrome.google.com/webstore/detail/…) 开发一个 javascript 库对我来说似乎有点矫枉过正。
      【解决方案3】:

      在不知道要保留多少的情况下,您可以查看文档的 "Export Symbols You Want To Keep" 部分。

      【讨论】:

      • 在我的问题中明确指出,我已经在导出(...访问带引号字符串的属性...)我的消息属性。我正在专门寻找不重命名的死代码删除。因为我不必通过电线传输源,所以我不太关心缩小。但是,我确实关心没有 10000 行死代码的干净的结果代码。我会自己添加一个答案,这样如果没有人能提出相关答案,我可以保持我的声誉,除了“它不起作用”。
      猜你喜欢
      • 2011-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-23
      • 2014-10-21
      相关资源
      最近更新 更多