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

标签 javascript google-closure-compiler

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

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

/** @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)

这一切都很好。问题是编译器已停止在所有 处重命名“英语”和“西类牙语”。即使它们不是外部类型。

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

编译成...

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

有办法阻止吗?如果不是,是否有此行为的原因?

我想使用外部类型来处理诸如来自服务器且没有重命名属性的 JSON 对象之类的东西。但是,如果每次我声明一个 extern,我都在蚕食编译器重命名和缩减代码的能力,我会找到另一种方法。也许我会采用编译器生成的属性重命名映射 (--property_map_output_file) 并在生成 JSON 响应时在服务器上使用它。

最佳答案

Closure 编译器可以根据类型重命名:https://github.com/google/closure-compiler/wiki/Type-Based-Property-Renaming 这也增强了其他优化,例如内联和死代码删除。这在 Google 内部使用,但会产生一定的成本,因为如果您在类型声明中“说谎”,它可能会引入一些困难的调试场景。

关于javascript - 我可以告诉 Closure 编译器仅针对特定类型停止重命名属性吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8201954/

相关文章:

javascript - 从 html 页面动态删除脚本文件

php - 替换一些文本后保留 HTML 格式(使用 PHP 和 JS)

javascript - Google Closure 在 Chrome 扩展编译期间需要 RequestFilter 和 BlockingResponse 类型。如何创建这样的类型?

javascript - 闭包编译器忽略对象突变

javascript - TypeScript 中的 EventTarget 类型不存在属性 'value'

javascript - 我可以在 Fabric.js 中创建更复杂的形状吗?

javascript - socket.io/socket.io.js 停留在(待定)- Node.js

javascript - 闭包编译器没有使用 && 将此 if 语句扁平化为 "guard"

javascript - Closure-Compiler 不足以缩小 JavaScript 以满足 Google PageSpeed 的要求

javascript - 使用闭包编译器编译两个js文件