Google Closure 编译器不会重命名某些属性

Google Closure Compiler doesn't rename some properties

据记载,使用高级优化的 Google Closure 编译器将重命名某些属性,但不会重命名其他属性。但是,似乎没有解释为什么它无法在以下代码中重命名属性 "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

您会注意到没有外部人员。

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

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

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

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

编译器重命名实际 classes 比匿名对象要好得多。您可能会尝试查看如果使 model 和实际 class.

会发生什么