Closure Compiler(以下简称“编译器”)提供三种不同级别的压缩模式。
WHITESPACE_ONLY(去空白优化)
该级别会删除代码中的注释、换行符和其他不必要的空格,输出后的代码在功能上和压缩前的代码完全一样。该压缩级别是三种级别中代码压缩最小的。
SIMPLE_OPTIMIZATIONS(简单优化)
该级别包含WHITESPACE_ONLY级别的所有功能,此外,它还提供用短名称重命名局部变量名和函数参数名的功能。用短名称重命名变量可以让代码体积明显的减少。由于该级别压缩只是对函数内部的局部变量重命名,所以不会影响被压缩代码与其他(未用Closure Compiler压缩的)JavaScript代码之间的相互调用。编译器还提供对JavaScript语法验证的功能,只要该代码不使用字符串名称访问本地变量(例如使用eval())。
该级别是编译器默认的压缩级别。
ADVANCED_OPTIMIZATIONS(高级优化)
该级别包含SIMPLE_OPTIMIZATIONS级别的所有功能,另外,它还添加了许多入侵性代码转换,从而实现三种级别中最高压缩比。使用该级别压缩代码能超越其它JS代码压缩工具(如YUI Compressor),达到最好的代码压缩效果。
为了使用这种极端压缩方式,ADVANCED_OPTIMIZATIONS要求代码在编写时遵循很强的约定。如果代码没有遵从这些约定,那么使用该级别生成的代码将不能运行。
例如,除非对压缩的代码完成某些确保互操作性的指定步骤,否则使用ADVANCED_OPTIMIZATIONS压缩后的代码有可能不能和未压缩的代码一起运行。如果没有对代码中的外部函数引用和外部属性引用做标识,编译器会对这些引用重命名,从而产生压缩代码和外部代码间名称不一致的错误。
更多相关内容请看使用Closure Compiler高级模式需要注意哪些问题?。
ADVANCED_OPTIMIZATIONS会对代码做以下转换:
- 更多侵入性的重命名
SIMPLE_OPTIMIZATIONS只会对函数参数和函数内部变量重命名,而ADVANCED_OPTIMIZATIONS还会对全局变量、函数名、属性名重命名。
- 删除无用代码
ADVANCED_OPTIMIZATIONS会删除未使用的代码。当代码和一个很大的JS库一起压缩时,这个功能特别有用。如果代码只用到类库中的小部分函数,编译器输出时会将类库中除这小部分函数外的其它函数都删除。
- 内联函数(inlining)
ADVANCED_OPTIMIZATIONS会将一些调用函数替换为函数体内容,这种转换被称为“内联函数”,编译器只会对那些它检查后认为安全的函数做内联函数,另外,它还会对它认为安全的常量或变量使用内联方式。