Closure 编译器编译级别

Closure 编译器允许您从三种编译级别中进行选择,包括轻松移除空格和注释,以及激进代码转换。

仅限空格

WHITESPACE_ONLY 编译级别会从代码中移除注释,并移除换行符、不必要的空格、无关的标点符号(如圆括号和分号)。输出 JavaScript 的功能与源 JavaScript 相同。

如果请求的输出语言模式与输入语言模式不同,系统仍会进行语言特征的翻译。请参阅标志和选项中的 --language_in--language_out

此编译级别提供了三个级别中最低的压缩。

简化

SIMPLE_OPTIMIZATIONS 编译级别会执行与 WHITESPACE_ONLY 相同的空格和注释移除,但也会在表达式和函数中执行优化,包括将局部变量和函数参数重命名为更短的名称。将变量重命名为更短的名称可以显著缩减代码。由于 SIMPLE_OPTIMIZATIONS 级别只会重命名函数本地的符号,因此它不会干扰已编译的 JavaScript 与其他 JavaScript 之间的交互。

使用 SIMPLE_OPTIMIZATIONS 进行编译始终会保留语法上有效的 JavaScript 的功能,前提是代码不使用字符串名称(例如,通过使用 eval() 语句或在函数上调用 toString)访问局部变量。

SIMPLE_OPTIMIZATIONS 是默认编译级别。

高级优化

ADVANCED_OPTIMIZATIONS 编译级别可执行与 SIMPLE_OPTIMIZATIONS 相同的转换,但添加多种更积极的全局转换,以实现所有三个级别的最高压缩。ADVANCED_OPTIMIZATIONS 级别对 JavaScript 的压缩效果远超其他工具。

为了实现这种极端压缩,ADVANCED_OPTIMIZATIONS 会对编译后的代码做出强有力的假设。如果您的代码不符合这些假设,ADVANCED_OPTIMIZATIONS 会生成无法运行的代码。

例如,使用 ADVANCED_OPTIMIZATIONS 编译的代码可能不适用于未编译的代码,除非您采取特殊步骤来确保互操作性。如果您不标记代码中引用的外部函数和属性,Closure 编译器会以不当方式重命名代码中的引用,这会导致代码与外部代码中的名称不匹配。

如需详细了解如何为 ADVANCED_OPTIMIZATIONS 准备代码,请参阅高级编译和 Extern

ADVANCED_OPTIMIZATIONS 转换包括:

  • 更激进的重命名

    使用 SIMPLE_OPTIMIZATIONS 进行编译只会重命名函数中的参数和变量。ADVANCED_OPTIMIZATIONS 还会重命名全局变量、函数名称和属性。

  • 停用代码

    使用 ADVANCED_OPTIMIZATIONS 进行编译会移除可能无法访问的代码。这在与大型库结合使用时尤其有用。如果仅使用某个大型库文件中的少数几个函数,编译器可以从输出中移除这些函数之外的所有函数。

  • 全局内联

    使用 ADVANCED_OPTIMIZATIONS 进行编译会将某些函数调用替换为函数的正文。这种转换称为“内嵌”。编译器仅在确定内联是安全且节省空间时才会内嵌函数。如果编译器确定可以安全地执行此操作,那么使用 ADVANCED_OPTIMIZATIONS 进行编译还会内嵌常量和一些变量。

如何设置编译级别

Closure Compiler 服务界面、服务 API 和应用都有不同的 compilation_level 设置方法。

在 Closure Compiler 服务界面中

如需在 Closure Compiler 服务界面中设置编译级别,请点击界面优化部分中的单选按钮。

界面屏幕截图

在 Closure Compiler Service API 中

如需在 Closure Compiler Service API 中设置编译级别,请添加名为 compilation_level 且值为 WHITESPACE_ONLYSIMPLE_OPTIMIZATIONSADVANCED_OPTIMIZATIONS 的请求参数,如以下 Python 程序所示:

#!/usr/bin/python2.4

import httplib, urllib, sys

params = urllib.urlencode([
    ('code_url', sys.argv[1]),
    ('compilation_level', 'ADVANCED_OPTIMIZATIONS'),
    ('output_format', 'text'),
    ('output_info', 'compiled_code'),
  ])

headers = { "Content-type": "application/x-www-form-urlencoded" }
conn = httplib.HTTPSConnection('closure-compiler.appspot.com')
conn.request('POST', '/compile', params, headers)
response = conn.getresponse()
data = response.read()
print data
conn.close()

在 Closure Compiler 应用中

如需在 Closure Compiler 应用中设置编译级别,请添加命令行标记 --compilation_level,并将值设为 WHITESPACE_ONLYSIMPLEADVANCED,如以下命令所示:

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