昨天接触到这篇文章《Best Practices for Speeding Up Your Web Site》,觉得太经典了,自己不由自主的想要翻译过来,鉴于本人的英语水平,只翻译了其中的某些条目,有错误在所难免。更多的还是推荐浏览原文。
首先的说明的是:优化页面显示速度,就是不管HTML内容多与少,都要尽量在最快的速度显示出来,这就是Front-end engineers首要明确的意图。所以下面所提及的优化方式,都是从这一目的出发的。下面的翻译的一些条目:
1.最小化HTTP request请求。因为一个页面显示所花费的时间很多都是花费在scripts,stylesheets,images,flashs等等,这些都会通过http request来加载,这些大概占用了页面加载时间的70%-80%,因此,减少HTTP request能很大的优化页面的加载速度。
2.使用第三方的代理服务器来加载scripts,stylesheets等等,这能降低本主服务器的负载,比如google ajax api提供的目前流行的js库:jquery,extjs,prototype,MooTools等等
3.在头部声明cache的expire。在用户第一次view页面的时候会加载全部的内容,包括html以及scripts,stylesheets,images等等,设置了cache的expire一方面能使得用户在下次view页面的时候能从缓存里读取一些数据,减少了HTTP Request的请求数,加快页面的显示。不过这要看用户view页面的回头率是否频繁。设置了cache的expire也要适当。一方面能加快加载速度,另一方面也有助于在cache的expire过期的时候使得用户获得页面的最新数据信息。
4.使用压缩技术(Gzip Components)。原理就是将scripts,stylesheet,images,flash等等压缩为一个zip文件,之后把这个zip文件链接进页面中来减少http request回调来加快页面的加载速度。通过摄自豪HTTP header的Accept-Encoding为gzip, deflate,之后在Response header里设置Content-Encoding: gzip来解压压缩包的文件,就可以将这些文件导入到页面的相应的部分。不过,如果页面中的Component比较少或者也是相对于非常小的话,还是不建议使用这种方法,还是使用普通的通过各自的连入方式加载Component。
5.将全部的Stylesheets放到head里来加载。Yahoo测试了这种方式证明了这一方式确实能加快页面的加载速度,“This is because putting stylesheets in the HEAD allows the page to render progressively.”。
6.将Scripts放置到Bottom(底部)。我们都知道,通过script标签引入文件会阻止下面的HTML内容的加载,等待script加载文件完成才加载下面的内容。因此:HTTP/1.1 specification建议在每一个主机名下不要超过两个Component同时下载。还有一点要说明的是:当script正在加载的时候,浏览器机会停止一切其他的加载项,甚至不同的主机下的文件都不会加载(通过iframe加载的内容)。
但是有时候有很难将scripts都放到bottom里,这里的主要问题就是通过document.write来添加页面内容以及作用域问题。因此,就需要使用其他的方式来解决这样的问题了。
这里有一种建议方案:就是使用deferred scripts(延迟执行scripts),通过使用script标签的defer属性来延迟执行不包含document.write的js代码。defer的机制就是先加载好scripts,之后在DOM加载完成之后,执行js代码(defer的延迟要比window.onload早),因此使用defer会在DOM加载完成,window.onload之前执行js代码。但是defer属性目前只有IE支持,Firefox等浏览器不支持,要通过检查DOM是否加载完成这样的方式来解决。因此,如果一个script可以defer延迟的话,同样也就可以把它放置到bottom里,这样就能加快页面的加载(显示)速度。
7.避免使用css的Expressions。CSS的expression虽然很强大,能动态修改css的样式规则,只有IE能识别expression属性。
但是,致命的问题在于:它执行的非常的频繁,页面的一个render,resize和scroll,以及用户的一些简单的鼠标操作,比如:移动鼠标等等都会触发expression的重复执行。一个测试表明:在页面内移动鼠标就非常容易的产生超过10000次的执行次数。这将是难以想象的耗费性能。
一种解决办法就是一次执行expression之后,就给css 样式指定确切的值,而不在需要依赖expression。
8.通过外联的方式来加载外部的Javascript和css到页面里。在第一条里我们谈到减少Http request请求来加载Component,而这里又提倡使用外联的方式来加载scripts、Stylesheet等等Component,不是冲突了吗?这里来解释一下:如果不是通过外联的方式来加载文件,这样在每次加载页面的时候,都需要去加载内联的Javascript和css内容,这就使得HTML容量变大了。而使用外联的方式的好处在于浏览器会缓存这些文件,第二次加载页面的时候就会在缓存里读取这些文件(如果缓存里还没有清除的话),这使得HTML页面“变小”了,不是更快加载HTML了吗。从这一角度来考虑,视具体情况而定,来综合考虑上面所提到的几种优化方案。
9.压缩Javascript和css代码。压缩代码就是清除掉一些不需要的characters,减小代码文件的大小,从而加快加载。可以通过使用JSMin或者YUI Compressor,还有Jspacker等等压缩工具。压缩代码的范围可以很广泛,包括独立的js或者css文件,当然也可以是内联的js或者css代码(google就使用了这种方式),也可以是上面所说的通过压缩Components联入页面的各个js或者css文件。
10.删除重复的Scripts Component。有时候如果不加注意,可能就会重复加载了同一个script联入文件,比如通过script联入,之后在某种形式下使用php的insertScript又联入了同一个文件,这都是有可能的。这将会有哪些不合理呢:一个是花费Http request的数目而且还会影响浏览器的缓存方面的问题,使得script重复加载。
(全文…)