可以为Closure Compiler输出TypeScript输出注释吗?

时间:2015-02-04 10:21:01

标签: javascript typescript obfuscation google-closure-compiler

我正在使用TypeScript,我想使用Closure-Compiler来缩小和混淆我在构建TS代码后获得的JS输出。

我读到GCC能够根据类型定义进行混淆。据我所知(如果我错了,请纠正我),这意味着如果我的代码上有类型注释,那么GCC将使用它们来进行更好的混淆。

例如,对于obj.someProp,GCC当前在我的代码中找到someProp属性名称的所有实例,而不考虑它所在的对象,并将所有这些实例替换为相同的混淆名称(例如o.a) 但是,如果我在我的代码上有类型注释,GCC将能够知道哪个对象属于哪种类型并相应地对其进行模糊处理 - 因此两个不同类型的相同属性名称将被混淆为两个不同的名称。

问题:

  • 我是否理解正确?
  • "类型安全"混淆是件好事吗? 我的意思是,它有什么好处?它似乎不会对生成的文件大小产生影响,甚至可能对gzip压缩文件大小产生负面影响(因为不同类型的密钥可能有更多不同)。
  • 我可以使用TypeScript以某种方式自动创建GCC注释吗? 由于TS已经是类型安全的,我相信它是可能的,但我怀疑它是一个功能。它可能需要TS编译器内部的知识。对此有何见解?

修改

我实际上刚刚找到了thisthis。我会检查出来并尽快发布更新。

3 个答案:

答案 0 :(得分:4)

更新

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


“使用优化类型”会触发多个编译器优化:

  • “消除歧义属性”
  • “ambiguate properties”
  • “内联属性”

消歧在优化过程的早期发生,并使类型无意识优化能够删除未使用的属性,虚拟化和其他优化

在重命名之前就出现了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