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_ONLY
、SIMPLE_OPTIMIZATIONS
或 ADVANCED_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_ONLY
、SIMPLE
或 ADVANCED
,如以下命令所示:
java -jar compiler.jar --compilation_level ADVANCED_OPTIMIZATIONS --js hello.js