2017-07-19 77 views
0

有人记录说,使用高级优化的Google Closure编译器会重命名一些属性,但不会重命名其他属性。然而,似乎没有解释为什么它不能重命名的属性在下面的代码“ID”和“知名度”:Google Closure编译器不会重命名某些属性

const model = { 
    age: 5, 
    id: 1234, 
    visibility: true, 
    skills: 4, 
    hair: 667 
} 


function doSomething() { 
    var s = Object.create(model); 
    console.log("Age: " + model.age); 

    s.visibility = "john"; 
    s.age = 2; 
    s.skills = 5; 
    s.hair = 999; 

    model.age = 6; 
    return s; 
} 

doSomething(); 

这是编译器设置:

java -jar closure-compiler/compiler.jar \ 
    --compilation_level ADVANCED_OPTIMIZATIONS \ 
    --js_output_file scripts/release/test-min.js \ 
    --warning_level VERBOSE \ 
    --language_out ECMASCRIPT5 \ 
    --language_in=ES6_Strict \ 
    --js scripts/temp/test.js 

你会注意到没有externs。

回答

1

如果闭包编译器认为它可以安全地执行操作,它将只重命名项目。有两种类型的属性,可以被重新命名:

不任何的extern对象
  • 属性,其中编译器有足够的类型信息来重命名,即使一个extern对象上存在产权上存在
    • 属性名称。

    idvisibility都作为缺省extern的属性存在。因此,除非有足够的类型信息,否则不能重命名。

    如果任何对象具有未知类型并且具有相同名称的属性,则基于类型的重命名将不会重命名它。这个未知属性甚至可以在默认的extern中。

    编译器比匿名对象重命名实际类要好得多。你可以尝试看看如果你制作model和实际的课程会发生什么。

  • +0

    不知道它使用了默认的外部。谢谢!谷歌搜索确实显示了有关默认外部的结果:https://github.com/google/closure-compiler/wiki/FAQ – AndroidDev