《高性能javascript》读书笔记:第九章 构建并部署高性能javascript应用

Apache Ant

Apache Ant (http://ant.apache.org/)是一个软件构建自动化工具。它类似于make,但是用java实现并用xml描述构建过程,而make则使用自有的Makefile格式。

使用方式从网上搜,这里不多做说明,只要知道它是用来构建Web应用的就行了。

另外还有些用来构建Web应用的,比如Rake(http://rake.rubyforge.org/),Rake是一个基于Ruby的类make的构建程序。

 

合并多个javascript文件

根据Yahoo特别性能小组的研究,网站提速指南中第一条也是最重要的一条规则,就是减少页面渲染所需的HTTP请求数。特别是针对那些首次访问网站的用户。

Apache Ant提供了合并多个文件的concat任务。js文件通常需要按特定的依赖顺序连接在一起。依赖关系一旦确定,使用filelist 或fileset元素集合能保存文件顺序。该Ant target示例:

<target name="js.concatenate">

  <concat destfile="${build.dir}/concatenated.js">

    <filelist dir="${src.dir}" files="a.js,b.js"/>

    <fileset dir="${src.dir}" includes="*.js" excludes="a.js,b.js"/>

  </concat>

</target>



该target在构建目录下创建一个名为concatenated.js的文件,它首先连接a.js,紧接着是b.js,然后是源目录下以字母顺序排列的其它文件。

注意:如果源文件中有任何一个文件(最后一个除外)不是以分号或行终止符结束的,那么合并结果可能不是有效的js代码。这个问题可以通过给concat任务添加fixlastline属性来修复,这个属性指示Ant检查每个被合并的文件是否以换行符结尾。

<concat destfile="${build.dir}/concatenated.js" fixlastline="yes">

....

</concat>



 

预处理javascript文件

预处理js源文件并不会让应用变得更快,但它允许你做些其它的事情,例如有条件地插入测试代码,来衡量你的应用程序的性能。

没有专门的js预处理器。由于c语言的讲法接近js,因此c预处理器(cpp)是个不错的选择。应用cpp后的Ant target看起来如下:

<target name="js.preprocess" depends="js.concatenate">

  <apply executable="cpp" dest="${build.dir}">

    <fileset dir="${build.dir}" includes="concatenated.js"/>

    <arg line="-p -c -ddebug"/>

    <srcfile/>

    <targetfile/>

    <mapper type="glob" from="concatenated.js" to="preprocessed.js"/>

  </apply>

</target>



这个target依赖js.concatenate target,它对前面的合并后文件运行cpp,并在构建目录中创建preprocessed.js文件保存运行结果。

注意cpp使用了标准的-p(忽略供c编译器使用的行编号 信息)和-c(包含程序注释)。还定了debug宏。

有了这个target,就可以直接在js文件中使用宏定义(#define,#undef)和条件编译(#if,#ifdef,#ifndef,#else,#elif,#endif)指令,比如,可以使用条件语句启用或删除性能检测代码:

#ifdef debug

  (new YAHOO.util.YUILoader({

    require:['profiler'],

    onSuccess:function(0){

      YAHOO.tool.profiler.registerFunction('foo',window);

    }

})).insert();

#endif



如果打算使用多行宏,确保是使用Unix行结束符(LF)。你可以使用fixcrlf Ant任务自动帮你修复。

 

Javascript压缩

JSMin  曾经的压缩标准

YUI Compressor 推荐

Closure Compiler 难以置信的压缩率,但让调试更麻烦,因为所有符号都被重命名了。在火狐中有个Closure Inspector扩展提供了混淆后符号与原始符号的映射。

 

缓存javascript文件

缓存http组件能极大提高网站回访用户的体验。在有缓存的情况下加载yahoo首页比没有缓存时的http请求数要少90%,下载的字节少83%,往返时间从24秒减少到0.9秒。缓存大多数用于图片,但它适用于所有静态内容,包括js文件。

Web服务器通过"Expires HTTP响应头”来告诉客户端一个资源就当缓存多长时间,它的值是一个遵循RFC1123标准的绝对时间戳,例如: Expires:Thu,01 Dec 1994 16:00:00 GMT

要将响应标记为“永不过期”,服务器可以发送一个时间为请求时间之后一年的Expires日期。按照HTTP 1.1RFC(RFC2616,14.21节),Web服务器发送的Expires日期不应超过1年。

如果使用Apache web server,ExpiresDefault指令允许根据当前时间设置到期日期。下面的这个例子把这个指令应用于图片,js文件和css样式表:

<FilesMatch "\.(jpg|jpeg|png|gif|js|css|htm|html)$">

  ExpiresActive on

  ExpiresDefault "access plus 1 year"

</FilesMatch>



某些web浏览器特别是移动设备里的浏览器,可能会有缓存限制。例如iphone上的safari不会缓存解压后超过25KB的文件,而在iphone3.0系统中限制为15KB。

html5离线应用缓存,依赖一个清单文件(manifestfile),来列出所有待缓存的资源。这个清单文件通过<html>标签中添加一个manifest属性来声明:

<!DOCTYPE html>

<html manifest="demo.manifest">

 

处理缓存问题

当升级时,需要确保用户下载到最新的静态内容,而不是缓存的内容,这个问题可以通过把改动过的静态资源重命名来解决。

 

使用内容分发网络CDN

CDN是在互联网上按地理位置分布计算机网络,它负责传递内容给终端用户。事实 上,通过向地理位置最近的用户传输内容,CDN能极大地减少网络延时。

第三方CDN服务比自建的CDN更经济些,比如Akamai Technologies(http://www.akamai.com/)或Limelight Networks(http://www.limelightnetworks.com/)

绝大多数的JS类库都可以通过CDN访问。例如YUI类库可直接从Yahoo!网络(服务器名为yui.yahooapis.com,更多信息可访问Http://developer.yahoo.com/yui/articles/hosting)获得,jquery/Dojo/Prototype/Script.aculo.us/MooTools/YUI及其它类库都能直接通过Google的CDN(服务器名为ajax.googleapis.com,更多信息可访问http://code.google.com/apis/ajaxlibs/)获得。

 

敏捷javascript构建过程

使用smasher程序

posted on 2012-03-03 23:33  LCM  阅读(471)  评论(0编辑  收藏  举报

导航