常见问题解答


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

通常,Closure 编译器应达到或超过其他代码缩减工具的压缩效果,并缩短 Web 应用的下载时间。此外,Closure 编译器可帮助您在开发期间(而不是测试期间)找出语法错误,并确定可能存在问题的代码模式。

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

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

Closure 编译器是否可以编译 HTML 中嵌入的 JavaScript?
不会。Closure 编译器仅适用于仅包含 JavaScript 的文件。
我可以将 Closure 编译器与其他 JavaScript 压缩工具一起使用吗?

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

请注意,Closure 编译器和其他缩减器可能对传入代码有期望。例如,删除注释的缩减器可能会移除其他工具所需的许可或注释信息。

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