常见问题解答


什么是 Closure Compiler?我为什么要使用它?
Closure 编译器是一种可加快 JavaScript 下载和运行速度的工具。您可以使用 Closure Compiler 来缩减 JavaScript 文件的大小,并提高其效率。
Closure Compiler 与现有的其他 JavaScript 压缩器有何不同?

一般来说,Closure Compiler 的压缩效果应达到或超过其他代码精简工具,并缩短 Web 应用的下载时间。此外,Closure 编译器还可以在开发期间(而不是测试期间)帮助您查找语法错误,并识别可能存在 bug 的代码模式。

在简单模式下,Closure 编译器应该能够比其他工具做得更好,因为它使用类似编译器的分析来寻找更多方法来最大限度地减小代码大小。例如,Closure Compiler 可以内嵌仅在少数情况下使用的函数、重用变量名称,以及预先计算常量表达式。

在高级模式下,Closure 编译器还可以使用您添加的类型注释来查找难以发现的 bug。

Closure 编译器能否编译嵌入在 HTML 中的 JavaScript?
不能。Closure 编译器只能处理仅包含 JavaScript 的文件。
我可以将 Closure Compiler 与其他 JavaScript 缩小器一起使用吗?

可以。Closure Compiler 会读取任何有效的 JavaScript 并生成有效的 JavaScript,因此您可以在通过其他压缩器运行 JavaScript 文件之前或之后,将 Closure Compiler 应用于该文件。

请注意,Closure 编译器和其他缩小器可能对传入的代码有一定要求。例如,剥离注释的缩小器可能会移除其他工具所需的许可或注释信息。

如何调试 Closure 编译器生成的 JavaScript?
如果您的已编译代码抛出错误或表现出意外行为,您可以使用源映射来调试问题。源映射可在已编译的代码与原始源代码之间建立映射,以便浏览器开发者工具向您显示原始源代码,而不是已编译的代码。 如需让 Closure 编译器生成源映射,请在命令行中传递 --create_source_map 标志。例如:
$ java -jar compiler.jar --js example.js --create_source_map ./example-map --js_output_file example-compiled.js
然后,如果您使用的是支持 Source Map 的浏览器(例如 Chrome 或 Firefox),则可以像对未编译的代码一样设置断点,并且浏览器的开发者工具会在原始源代码中显示相应的代码行。如需详细了解 Chrome 的开发者工具(包括有关源映射的信息),请参阅 JavaScript 调试
编译器是否会在应用执行速度和下载代码大小之间做出权衡?
可以。任何优化编译器都会做出权衡。某些大小优化确实会带来较小的速度开销。不过,Closure Compiler 的开发者一直小心谨慎,避免引入显著的额外运行时。编译器的某些优化甚至可以缩短运行时(请参阅下一个问题)。
编译器是否会针对速度进行优化?
在大多数情况下,代码越小,速度越快,因为下载时间通常是 Web 应用中最重要的速度因素。减少冗余的优化还可以加快代码的运行时间。
可以编译的文件大小是否有限制?
编译 Web 服务的最大文件大小有限制,但独立编译器应用没有。
Closure 编译器是否适用于所有平台?
编译器是用 Java 编写的,因此可以在任何运行 Java 的地方运行。
编译器是否可以处理任何合法的 JavaScript?
大多数情况下是这样。某些 JavaScript 构造(包括 eval()with())可能会使编译器转换所依据的假设失效。
我需要了解多少 Web 开发知识才能使用 Closure 编译器?
Closure 编译器是一款 JavaScript 开发工具,因此您需要了解如何使用 JavaScript 编程才能使用该编译器。不过,任何使用 JavaScript 的人都可以从使用 Closure 编译器中受益。
Closure 编译器如何与 Closure 库搭配使用?
Closure 编译器为使用 Closure 库的代码提供特殊检查和优化。此外,Closure 编译器服务还可以自动包含 Closure 库文件。在 Closure 中找到自己的方式介绍了用于声明所需 Closure 部分的语法。如需了解如何将 Closure 库与 API 搭配使用,请参阅 API 参考。如需将 Closure 库与 Closure Compiler 应用搭配使用,您必须先下载 Closure 库。默认情况下,编译器应用中已启用对 Closure 库的支持。
当使用 ADVANCED_OPTIMIZATIONS 进行编译时,我的代码停止工作或编译器产生错误。为什么?
使用高级模式通常需要进行一些准备工作并更改代码。高级编译和外部声明介绍了如何确保代码与 ADVANCED_OPTIMIZATIONS 搭配使用。
为什么编译后的脚本中存在随机换行符?
Closure 编译器有意每隔 500 个字符左右添加换行符。防火墙和代理有时会损坏或忽略包含很长行的 JavaScript 文件。每 500 个字符添加一个换行符即可避免此问题。移除换行符对脚本的语义没有影响。对代码大小的影响很小,并且编译器会优化换行符放置位置,以便在对文件进行 gzip 压缩时,代码大小惩罚更小。
我有一些版权声明或开源许可文本必须显示在我的源代码中。如何防止 Closure 编译器剥离此文本?
Closure Compiler 支持 JSDoc @license 标记。向任何 JSDoc 注释添加 @license 标记,以在编译器输出中保留该注释。如需了解详情,请参阅为 Closure 编译器添加 JavaScript 注释