我正在使用TypeScript,我想使用Closure-Compiler来缩小和混淆我在构建TS代码后获得的JS输出。
我读到GCC能够根据类型定义进行混淆。据我所知(如果我错了,请纠正我),这意味着如果我的代码上有类型注释,那么GCC将使用它们来进行更好的混淆。
例如,对于obj.someProp
,GCC当前在我的代码中找到someProp
属性名称的所有实例,而不考虑它所在的对象,并将所有这些实例替换为相同的混淆名称(例如o.a
)
但是,如果我在我的代码上有类型注释,GCC将能够知道哪个对象属于哪种类型并相应地对其进行模糊处理 - 因此两个不同类型的相同属性名称将被混淆为两个不同的名称。
问题:
修改
答案 0 :(得分:4)
截至20150315版本的Closure-compiler,默认情况下会启用基于类型的优化。
“使用优化类型”会触发多个编译器优化:
消歧在优化过程的早期发生,并使类型无意识优化能够删除未使用的属性,虚拟化和其他优化
在重命名之前就出现了ambiguation,它专门用于通过利用较短的名称并使它们更常见来改善代码大小(这可以改善gzipping)
内联属性使用类型信息来内联属性,否则这些属性不会被虚拟化。这个过程效果较差,因此讨论不那么有趣。
这些优化对于大型项目非常有效,但由于通常没有任何运行时类型实施,因此存在一些风险。有可能以各种无意的方式对这些类型撒谎。我在这个项目维基页面中更详细地描述了风险:
https://github.com/google/closure-compiler/wiki/Type-Based-Property-Renaming
风险很低但可以通过使用编译器支持的“运行时类型检查”检测来减轻风险。如果您正在尝试改造更大的项目或无法隔离“错误”消歧,请查看“运行时类型检查”
TypeScript问题是一个单独的问题,应该是一个单独的问题。可以在某种程度上将TypeScript转换为Closure Compiler类型系统,但TypeScript和Closure Compiler类型系统之间存在差异(TypeScript明显不合理且允许许多不安全的分配)。
答案 1 :(得分:3)
您的理解大多是正确的。基于类型的重命名(需要--use_types_for_optimization
标志)的优点是,不再阻止名称与extern中的任何属性相同的属性重命名。
var foo = {};
foo.src = 'test'; //only renameable with type based optimizations
对于typescript,正在修改closure-compiler以理解类型 - 脚本样式类型表示法。然而,这个项目还处于初期阶段。您链接的插件是我现在知道的最佳选择。
Typescript和Closure-Compiler中的类型系统现在不完全兼容。这也正在积极开展。
答案 2 :(得分:1)
我认为Google Closure Compiler将在不久的将来支持TypeScript注释。看here