无需重命名即可进行高级优化

时间:2010-12-09 20:06:24

标签: javascript google-closure-compiler

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

我希望能够在没有高级优化附带的重命名的情况下执行死代码删除。闭包编译器可以实现吗?

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

是的,我同意。在所有处理传递数据的代码中使用obj["prop"]而不是obj.prop是非常丑陋的,只是为了在高级模式下使用Closure Compiler。

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

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

这个对象在由Closure Compiler编译之后,会将字段名称修改(重命名)映射到原始的,未编码的名称,例如:

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;
}

对于收到的数据,请执行相反的操作。

答案 2 :(得分:0)

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