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

标签 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 .我会检查并尽快发布更新。

最佳答案

更新

自 20150315 版 Closure-compiler 起,默认启用基于类型的优化。


“使用类型进行优化”触发了几个编译器优化:

  • “消除属性歧义”
  • “模糊属性”
  • “内联属性”

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

歧义发生在重命名之前,特别是通过利用较短的名称并使它们更常见(这改进了 gzipping)来改善代码大小

内联属性使用类型信息来内联不会被去虚拟化的属性。这个过程不太有效,因此对这个讨论不太感兴趣。

这些优化对于大型项目非常有效,但也存在一些风险,因为通常没有任何运行时类型强制执行。有可能以各种无意的方式对类型撒谎。我在此项目维基页面中更详细地描述了风险:

https://github.com/google/closure-compiler/wiki/Type-Based-Property-Renaming

风险很低,但可以通过使用编译器支持的“运行时类型检查”工具来减轻。如果您正在尝试改造一个更大的项目或在隔离“错误的”歧义方面遇到困难,请查看“运行时类型检查”

TypeScript 问题是一个单独的问题,实际上应该是一个单独的问题。将 TypeScript 转换为 Closure Compiler 类型系统在某种程度上是可能的,但 TypeScript 和 Closure Compiler 类型系统之间存在差异(TypeScript 显然不可靠,并且允许许多不安全的分配)。

关于javascript - TypeScript 可以为 Closure Compiler 输出注释吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28318862/

相关文章:

javascript - 为什么我的 youtube 视频不报告事件?

node.js - VS 代码 : help debugging angular 2 with express

obfuscation - 使用 Google Closure 进行项目范围内的混淆

c++ - 预处理器指令 if-elses 是否正常运行?

javascript - 使用 jquery 如何获取父 LI,其中 LI 的文本与我的按钮文本相匹配?

javascript - 适用于发布商的 DoubleClick : Specify browser and ad dimensions

php - 在线购物车付款

angular - *ngFor 在 Angular 2 中不起作用?

typescript - 断言接口(interface)中的可选属性在编译时在类中不为空

java - 使用 Proguard GUI 进行混淆,在没有配置文件的情况下保持类