Closure 编译器编译级别

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_ONLYSIMPLEADVANCED,如以下命令所示:

java -jar compiler.jar --compilation_level ADVANCED_OPTIMIZATIONS --js hello.js