Closure 编译器提供三种级别的编译,从简单地移除空格和注释到积极地转换代码,应有尽有。
WHITESPACE_ONLY
WHITESPACE_ONLY
编译级别会从代码中移除注释,还会移除换行符、不必要的空格、多余的标点符号(例如圆括号和分号)以及其他空白字符。输出 JavaScript 在功能上与源 JavaScript 完全相同。
如果请求的输出语言模式与输入语言模式不同,仍会发生语言功能转译。
请参阅标志和选项中的 --language_in
和 --language_out
。
此编译级别提供的压缩程度是三个级别中最低的。
SIMPLE_OPTIMIZATIONS
SIMPLE_OPTIMIZATIONS
编译级别执行与 WHITESPACE_ONLY
相同的空白和注释移除操作,但它还会在表达式和函数内执行优化,包括将局部变量和函数参数重命名为更短的名称。将变量重命名为较短的名称可显著减小代码大小。由于 SIMPLE_OPTIMIZATIONS
级重命名仅适用于函数本地的符号,因此不会干扰已编译的 JavaScript 与其他 JavaScript 之间的互动。
使用 SIMPLE_OPTIMIZATIONS
进行编译始终会保留语法有效的 JavaScript 的功能,前提是代码不使用字符串名称访问局部变量(例如,通过使用 eval()
语句或通过对函数调用 toString)。
SIMPLE_OPTIMIZATIONS
是默认的编译级别。
ADVANCED_OPTIMIZATIONS
ADVANCED_OPTIMIZATIONS
编译级别执行的转换与 SIMPLE_OPTIMIZATIONS
相同,但添加了各种更激进的全局转换,以实现所有三个级别中最高的压缩率。ADVANCED_OPTIMIZATIONS
级压缩可将 JavaScript 压缩到其他工具无法达到的程度。
为了实现这种极高的压缩率,ADVANCED_OPTIMIZATIONS
对已编译的代码做出了强假设。如果您的代码不符合这些假设,ADVANCED_OPTIMIZATIONS
将生成无法运行的代码。
例如,使用 ADVANCED_OPTIMIZATIONS
编译的代码可能无法与未编译的代码搭配使用,除非您采取特殊步骤来确保互操作性。如果您未标记代码中引用的外部函数和属性,Closure 编译器会不恰当地重命名代码中的引用,导致代码中的名称与外部代码中的名称不匹配。
如需详细了解如何为 ADVANCED_OPTIMIZATIONS
准备代码,请参阅高级编译和外部声明。
ADVANCED_OPTIMIZATIONS
转换包括:
- 更激进的重命名:
使用
SIMPLE_OPTIMIZATIONS
进行编译只会重命名函数内的参数和变量。ADVANCED_OPTIMIZATIONS
还会重命名全局变量、函数名称和属性。 - 移除无用代码:
使用
ADVANCED_OPTIMIZATIONS
进行编译会移除可证明无法访问的代码。与大型库结合使用时,此功能特别有用。如果您仅使用大型库文件中的少数几个函数,编译器可以从其输出中移除除这些函数之外的所有内容。 - 全局内联:
使用
ADVANCED_OPTIMIZATIONS
进行编译会将某些函数调用替换为函数的正文。这种转换称为“内嵌”。编译器仅在确定内联安全且可节省空间时才会内联函数。使用ADVANCED_OPTIMIZATIONS
进行编译时,如果编译器确定可以安全地内联常量和某些变量,也会这样做。
如何设置编译级别
如需在 Closure 编译器应用中设置编译级别,请添加命令行标志 --compilation_level
,并将其值设置为 WHITESPACE_ONLY
、SIMPLE
或 ADVANCED
,如以下命令所示:
java -jar compiler.jar --compilation_level ADVANCED_OPTIMIZATIONS --js hello.js