为什么Closure Compiler不重命名具有特定名称的对象?

Sea*_*ter 2 google-closure-compiler

当我在http://closure-compiler.appspot.com上的闭包编译器中测试以下代码时:

// ==ClosureCompiler==
// @output_file_name default.js
// @compilation_level ADVANCED_OPTIMIZATIONS
// @formatting pretty_print
// ==/ClosureCompiler==

// These get renamed
window.foo = {};
window.bar = {};

// These don't
window.uid = {};
window.test = {};
Run Code Online (Sandbox Code Playgroud)

输出是:

window.a = {};
window.b = {};
window.uid = {};
window.test = {};
Run Code Online (Sandbox Code Playgroud)

为什么重命名:

window.foo = {};
window.bar = {};
Run Code Online (Sandbox Code Playgroud)

但不是:

window.uid = {};
window.test = {};
Run Code Online (Sandbox Code Playgroud)

某些词似乎是一个问题?

Cha*_*rth 6

更新

截至20150315版本的Closure-compiler,默认情况下启用基于类型的优化.


除非--use_types_for_optimization启用该标志,否则Closure Compiler不会重命名与externs中对象上定义的任何属性同名的属性.有关详细信息,请参阅项目常见问题

  • `--use_only_custom_externs`是不同的.它排除了默认的externs,它为您提供了重命名效果.但是,它可能不完全是您想要的,因为除非您手动添加它们,否则现在将不存在默认DOM对象定义. (2认同)