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 只有在它认为可以安全地这样做时才会重命名项目。有两种类型的属性可以重命名:
- 属性 不存在于任何外部对象上的名称
- 即使 属性 存在于外部对象上,编译器也有足够的类型信息进行重命名的属性。
id
和 visibility
都作为属性存在于默认的 externs 中。因此,除非存在足够的类型信息,否则无法重命名它们。
如果任何对象具有未知类型并且具有相同名称的 属性,基于类型的重命名将不会重命名它。这个未知的 属性 甚至可以在默认的 externs 中。
编译器重命名实际 classes 比匿名对象要好得多。您可能会尝试查看如果使 model
和实际 class.
会发生什么
据记载,使用高级优化的 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 只有在它认为可以安全地这样做时才会重命名项目。有两种类型的属性可以重命名:
- 属性 不存在于任何外部对象上的名称
- 即使 属性 存在于外部对象上,编译器也有足够的类型信息进行重命名的属性。
id
和 visibility
都作为属性存在于默认的 externs 中。因此,除非存在足够的类型信息,否则无法重命名它们。
如果任何对象具有未知类型并且具有相同名称的 属性,基于类型的重命名将不会重命名它。这个未知的 属性 甚至可以在默认的 externs 中。
编译器重命名实际 classes 比匿名对象要好得多。您可能会尝试查看如果使 model
和实际 class.