四月, 2010的档案

理解Closure Compiler强加的约束

Closure Compiler期望输入的JavaScript符合一定的约束条件。压缩级别越高,约束条件越多。

本文分别介绍每种级别的条件约束。

适用于所有级别的约束

下面两条约束条件适用于Closure Compiler(以下简称“编译器”)的所有级别压缩:

  • 编译器只能识别Ecmascript 262第三版
    Ecmascript第三版是Javascript 1.5 和 JScript 5.5的基础,当人们提到“JavaScript”时,通常指的是这个版本的JavaScript。编译器不支持任何版本的JScript或者高于1.5版本的JavaScript。

    符合Ecmascript语言规范的浏览器特有特性能够很好的在编译器中工作,例如用合法JavaScript语法创建的ActiveX对象;不符合Ecmascript语言规范的浏览器特有特性会导致编译器错误,例如,Firefox的JavaScript引擎支持const关键字,但JavaScript规范中没有包含这个关键字,所以编译器不支持它。本约束能让编译器检查代码是否兼容所有浏览器。

  • 编译器不保留注释
    选择编译器的任何级别压缩都会删除代码中的注释,所以那些依赖特定注释的代码不能用编译器来压缩。

    举个例子,因为编译器不会保留代码注释,所以代码中不能直接使用JScript的条件化注释,然而,你可以使用eval()将代码中的条件化注释包起来,编译器可以正确的压缩下面的代码:

    JAVASCRIPT:
    1. x = eval("/*@cc_on 2+@*/ 0");

    提示:你可以使用@preserve annotation参数在压缩后的代码顶部包含如开源代码授权或者其它重要的文字。

详情 »

Closure Compiler三种压缩级别

Closure Compiler(以下简称“编译器”)提供三种不同级别的压缩模式。

WHITESPACE_ONLY(去空白优化)

该级别会删除代码中的注释、换行符和其他不必要的空格,输出后的代码在功能上和压缩前的代码完全一样。该压缩级别是三种级别中代码压缩最小的。

SIMPLE_OPTIMIZATIONS(简单优化)

该级别包含WHITESPACE_ONLY级别的所有功能,此外,它还提供用短名称重命名局部变量名和函数参数名的功能。用短名称重命名变量可以让代码体积明显的减少。由于该级别压缩只是对函数内部的局部变量重命名,所以不会影响被压缩代码与其他(未用Closure Compiler压缩的)JavaScript代码之间的相互调用。编译器还提供对JavaScript语法验证的功能,只要该代码不使用字符串名称访问本地变量(例如使用eval())。

该级别是编译器默认的压缩级别。

ADVANCED_OPTIMIZATIONS(高级优化)

该级别包含SIMPLE_OPTIMIZATIONS级别的所有功能,另外,它还添加了许多入侵性代码转换,从而实现三种级别中最高压缩比。使用该级别压缩代码能超越其它JS代码压缩工具(如YUI Compressor),达到最好的代码压缩效果。

为了使用这种极端压缩方式,ADVANCED_OPTIMIZATIONS要求代码在编写时遵循很强的约定。如果代码没有遵从这些约定,那么使用该级别生成的代码将不能运行。

例如,除非对压缩的代码完成某些确保互操作性的指定步骤,否则使用ADVANCED_OPTIMIZATIONS压缩后的代码有可能不能和未压缩的代码一起运行。如果没有对代码中的外部函数引用和外部属性引用做标识,编译器会对这些引用重命名,从而产生压缩代码和外部代码间名称不一致的错误。

更多相关内容请看使用Closure Compiler高级模式需要注意哪些问题?

ADVANCED_OPTIMIZATIONS会对代码做以下转换:

  • 更多侵入性的重命名
    SIMPLE_OPTIMIZATIONS只会对函数参数和函数内部变量重命名,而ADVANCED_OPTIMIZATIONS还会对全局变量、函数名、属性名重命名。
  • 删除无用代码
    ADVANCED_OPTIMIZATIONS会删除未使用的代码。当代码和一个很大的JS库一起压缩时,这个功能特别有用。如果代码只用到类库中的小部分函数,编译器输出时会将类库中除这小部分函数外的其它函数都删除。
  • 内联函数(inlining)
    ADVANCED_OPTIMIZATIONS会将一些调用函数替换为函数体内容,这种转换被称为“内联函数”,编译器只会对那些它检查后认为安全的函数做内联函数,另外,它还会对它认为安全的常量或变量使用内联方式。

使用Closure Compiler service压缩代码

使用Closure Compiler service是熟悉Closure Compiler压缩最简单的方法。

  • 在新的窗口或Tab中访问Closure Compiler UI:http://closure-compiler.appspot.com
  • 你能看到预制了一个简单的Hello World函数的Closure Compiler UI。
    UI screenshot
  • 点击“Compile”查看结果:
    UI screenshot

仅此而已!现在你有了一个函数名和源代码一样但体积小了许多的JavaScript代码。Closure Compiler service通过删除注释、空格和重命名基 详情 »

Closure Compiler介绍

什么是Closure Compiler?

Closure Compiler是一个让JavaScript下载和运行加速的工具。它是一个真正的JavaScript编译器。它不是将源代码编译成机器码,而是将源代码编译成更优质的JavaScript代码。它解析、分析JavaScript代码,移除无用的代码,使代码最小化。它还会检查代码语法、变量引用、类型,对JavaScript的常见缺点发出告警。

为了便于调试编译后的代码,你可以安装一个基于Firebug插件的Closure分析器(Closure Inspector),安装后就能使用Firebug方便的查看编译器的输出。

Closure Compiler也能和另一个网页性能评估工具——Page Speed结合。

详情 »