Google Closure Compiler如何处理引号(字符串文字)?

时间:2013-11-09 10:24:05

标签: javascript quotes options google-closure-compiler

问题'Google Closure Compiler如何处理引号(字符串文字)?'也可以重新措辞如下:

  • 为什么Closure用双引号替换/交换单引号?
  • Closure如何决定使用什么引用格式/样式?
  • (如何)我可以更改此(默认)行为吗?

注1:这个问题关于为什么Closure(或其他一些缩小词)选择更喜欢双引号(如herehere所述)。

注2:这个问题不是关于单引号和双引号的讨论,但是有些人理解GCC对我们的代码做什么(以及为什么)是非常有用的!

1 个答案:

答案 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_DELIMITERformatting之外,还有第三个选项 (注意:在当前的源代码中,目前仍然可以找到许多对'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_PRINTPRINT_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有一些解释(我期望它)。