Google Closure Compiler不会重命名某些属性

时间:2017-07-19 04:01:48

标签: google-closure-compiler

据记载,使用高级优化的Google Closure Compiler将重命名某些属性,但不会重命名其他属性。但是,似乎没有解释为什么它无法在以下代码中重命名属性“id”和“visibility”:

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

你会注意到没有外围人。

1 个答案:

答案 0 :(得分:2)

Closure-compiler只会在认为可以安全地重命名项目时重命名。有两种类型的属性可以重命名:

  • 任何外部对象上不存在的属性名称
  • 即使属性存在于extern对象上,编译器也有足够的类型信息可以重命名的属性。

idvisibility都作为默认外设中的属性存在。因此,除非有足够的类型信息,否则无法重命名。

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

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