我可以告诉Closure编译器,仅针对特定类型,停止重命名属性吗?

时间:2011-11-20 13:52:37

标签: javascript google-closure-compiler

这个问题如下:Why does Closure compiler rename properties of an extern type?约翰对这个问题的回答提出了第二个问题。

如果我按照建议声明extern类型:

/** @interface */
function SpanishNoun() {}
/** @type {string} */
SpanishNoun.prototype.english;
/** @type {string} */
SpanishNoun.prototype.spanish;

那么Javascript就像:

/**
 * @param {SpanishNoun} n 
 */
exp.foo = function (n) {
    console.log(n.english, n.spanish, n['english'], n['spanish']);  
}

将根据需要编译为:

function(a){console.log(a.english,a.spanish,a.english,a.spanish)};

这些属性不会像往常一样重命名。如果没有extern声明,编译后的代码将如下所示:

function(a){console.log(a.a,a.c,a.english,a.spanish)

这一切都很好。问题是编译器已停止在所有位置重命名“english”和“spanish”。即使他们不是外部类型。

/**
 * @param {AnotherType}  
 */
exp.bar = function (c) {
    c.other = c.english;
}

编译为......

function(a){a.b=a.english};

有办法阻止这个吗?如果没有,是否有这种行为的原因?

我想使用extern类型来处理源自服务器但没有重命名属性的JSON对象。但是,如果每次我声明一个extern,我正在扼杀编译器重命名和缩小代码的能力,我会找到另一种方式。也许我将采用编译器生成的属性重命名映射(--property_map_output_file),并在生成JSON响应时在服务器上使用它。

1 个答案:

答案 0 :(得分:3)

Closure编译器可以根据类型重命名:https://github.com/google/closure-compiler/wiki/Type-Based-Property-Renaming 这增强了其他优化,例如内联和死代码删除。这在Google内部使用,但需要付出代价,因为如果你“趴在”你的类型声明中,它会引入一些硬调试方案。