问题'Google Closure Compiler如何处理引号(字符串文字)?'也可以重新措辞如下:
注1:这个问题不关于为什么Closure(或其他一些缩小词)选择更喜欢双引号(如here和here所述)。
注2:这个问题不是关于单引号和双引号的讨论,但是有些人理解GCC对我们的代码做什么(以及为什么)是非常有用的!
答案 0 :(得分:5)
经常声明(或问为什么) G oogle C losure C ompiler(GCC)用双引号替换单引号(即使compilation_level
设置为WHITESPACE_ONLY
!!!):
示例 xmp_1.js:
alert('Hello world!'); // output: alert("Hello world!");
然而......这只是'真相'的一半,因为:
示例 xmp_2.js:
alert('Hello "world"!'); // output: alert('Hello "world"!');
// *NOT*: alert("Hello \"world\"!");
GCC本质上是'你的原始javascript'到'更小(也更有效)的javascript'翻译器:所以它不会“盲目地”用双重替换单引号引用,但试图选择'最佳引用字符'(毕竟......其中一个主要目标是'迷你'脚本)。
从源代码(CompilerOptions.java)和this issue-report可以了解到:
如果字符串包含的引号多于双引号,那么 编译器将使用双引号包装字符串,反之亦然 如果字符串不包含引号或相同数量的单个和 双引号,然后编译器将默认使用双引号。
喜欢这个示例 xmp_3.js:
alert('Hello "w\'orld"!'); // output: alert('Hello "w\'orld"!');
alert('Hello "w\'o\'rld"!'); // alert("Hello \"w'o'rld\"!");
注意上面的xmp_3如何产生一个'混合'输出,它同时使用'
和"
作为外引号:最佳选择后跟默认值(当它无关紧要时)。
事实证明,有一些严重的合法现实案例,违反单引号会更好。如上文引用的issue 836(2012年10月8日)中所述:
FT网络应用程序(app.ft.com)和Playbook 的Economist应用程序提供 客户端的JavaScript更新以及其他资源 将它们作为JSON编码对象的一部分进行传输。 JSON使用double 本机引用,所以编译JavaScript中的所有双引号 需要被转义。这会使FT网络应用程序的JS大小膨胀 传输大量更新时大约20kB。
该问题的记者带来了一个礼物:一个补丁,添加了选项prefer_single_quotes
以将默认报价字符从双引号更改为单引号。
项目成员Santos 考虑将默认双引号更改为单引号('并查看是否有人抱怨').. TWICE (也是在记者/补丁撰稿人表示他将其作为一个选项实施后,它不会产生任何向后兼容性的后果,因为“有些人可能依赖于字符串输出带有双引号的某些奇怪的原因”。
然而,大约一个星期后补丁被接受(r2258),又一周后重做(r2257),2012年10月30日桑托斯报告说现在可以通过以下方式启用该选项:
的 --formatting=SINGLE_QUOTES
强>
(对于PRETTY_PRINT
- 密钥,除了PRINT_INPUT_DELIMITER
和formatting
之外,还有第三个选项
(注意:在当前的源代码中,目前仍然可以找到许多对'prefer_single_quotes'的引用。)
<强>用法:强>
如果您(下载并)使用(本地java)应用程序:
java -jar compiler.jar --js xmp_1.js --formatting SINGLE_QUOTES
你会看到:alert('Hello world!');
现在编译为alert('Hello world!');
但是,在撰写本文时,位于http://closure-compiler.appspot.com的编译器服务API和用户界面(很可能使用API),不接受第三个(新的,尽管是存在的一年)格式化选项:SINGLE_QUOTES
并将抛出错误:
17: Unknown formatting option single_quotes.
在通过源挖掘(再次)后,似乎(我不是Java专家)这是因为jscomp/webservice/common/Protocol.java只接受较旧的PRETTY_PRINT
和PRINT_INPUT_DELIMITER
* All the possible values for the FORMATTING key.
*/
public static enum FormattingKey implements ProtocolEnum {
PRETTY_PRINT("pretty_print"),
PRINT_INPUT_DELIMITER("print_input_delimiter"),
;
如果此选项在API和/或用户界面中可用,我将更新此答案。
希望这可以帮助并节省一些时间,因为谷歌可以找到关于SINGLE_QUOTES
的唯一文档和参考目前在这一个问题836和源中的一些评论。现在它对SO有一些解释(我期望它)。