以上是一張web2.0頁(yè)面的生命周期圖。工程師很形象地講它分成了“懷孕,出生,畢業(yè),結(jié)婚”四個(gè)階段。如果在我們點(diǎn)擊網(wǎng)頁(yè)鏈接的時(shí)候能夠意識(shí)到 這個(gè)過(guò)程而不是簡(jiǎn)單的請(qǐng)求-響應(yīng)的話,我們便可以挖掘出很多細(xì)節(jié)上可以提升性能的東西。今天聽了淘寶小馬哥的一個(gè)對(duì)yahoo開發(fā)團(tuán)隊(duì)對(duì)web性能研究的 一個(gè)講座,感覺收獲很大,想在blog上做個(gè)分享。
相信很多人都聽過(guò)優(yōu)化網(wǎng)站性能的14條規(guī)則。更多的信息可見developer.yahoo.com
1. 盡可能的減少 HTTP 的請(qǐng)求數(shù)
[content]
2. 使用 CDN(Content Delivery Network)
[server]
3. 添加 Expires 頭(或者 Cache-control )
[server]
4. Gzip 組件
[server]
5. 將 CSS 樣式放在頁(yè)面的上方
[css]
6. 將腳本移動(dòng)到底部(包括內(nèi)聯(lián)的)
[javascript]
7. 避免使用 CSS 中的 Expressions
[css]
8. 將 JavaScript 和 CSS 獨(dú)立成外部文件
[javascript] [css]
9. 減少 DNS 查詢
[content]
10. 壓縮 JavaScript 和 CSS (包括內(nèi)聯(lián)的)
[javascript] [css]
11. 避免重定向
[server]
12. 移除重復(fù)的腳本
[javascript]
13. 配置實(shí)體標(biāo)簽(ETags)
[css]
14. 使 AJAX 緩存
在firefox下有一個(gè)插件yslow,集成在firebug中,你可以用它很方便地來(lái)看看自己的網(wǎng)站在這幾個(gè)方面的表現(xiàn)。
這是對(duì)用yslow對(duì)我的網(wǎng)站西風(fēng)坊測(cè)評(píng)的結(jié)果,很遺憾,只有51分。呵呵。中國(guó)各大網(wǎng)站的分值都不高,剛測(cè)了一下,新浪和網(wǎng)易都是31分。然后yahoo(美國(guó))的分值確實(shí)97分!可見yahoo在這方面作出的努力。從他們總結(jié)的這14條規(guī)則,已經(jīng)現(xiàn)在又新增加的20個(gè)點(diǎn)來(lái)看,有很多細(xì)節(jié)我們真得是怎么都不會(huì)去想,有些做法甚至是有些“變態(tài)”了。
第一條、盡可能的減少 HTTP 的請(qǐng)求數(shù) (Make Fewer HTTP Requests )
http請(qǐng)求是要開銷的,想辦法減少請(qǐng)求數(shù)自然可以提高網(wǎng)頁(yè)速度。常用的方法,合并css,js(將一個(gè)頁(yè)面中的css和js文件分別合并)以及 Image maps和css sprites等。當(dāng)然或許將css,js文件拆分多個(gè)是因?yàn)閏ss結(jié)構(gòu),共用等方面的考慮。阿里巴巴中文站當(dāng)時(shí)的做法是開發(fā)時(shí)依然分開開發(fā),然后在后臺(tái)對(duì)js,css進(jìn)行合并,這樣對(duì)于瀏覽器來(lái)說(shuō)依然是一個(gè)請(qǐng)求,但是開發(fā)時(shí)仍然能還原成多個(gè),方便管理和重復(fù)引用。yahoo甚至建議將首頁(yè)的css和js 直接寫在頁(yè)面文件里面,而不是外部引用。因?yàn)槭醉?yè)的訪問量太大了,這么做也可以減少兩個(gè)請(qǐng)求數(shù)。而事實(shí)上國(guó)內(nèi)的很多門戶都是這么做的。
而css sprites是指只用將頁(yè)面上的背景圖合并成一張,然后通過(guò)css的background-position屬性定義不過(guò)的值來(lái)取他的背景。淘寶和阿里巴巴中文站目前都是這樣做的。有興趣的可以看下淘寶和阿里巴巴的背景圖。
http://www.csssprites.com/ 這是個(gè)工具網(wǎng)站,它可以自動(dòng)將你上傳的圖片合并并給出對(duì)應(yīng)的background-position坐標(biāo)。并將結(jié)果以png和gif的格式輸出。
第二條、使用CDN(內(nèi)容分發(fā)網(wǎng)絡(luò)): Use a Content Delivery Network
說(shuō)實(shí)話,對(duì)于CDN這一塊自己并不是很了解,簡(jiǎn)單地講,通過(guò)在現(xiàn)有的Internet中增加一層新的網(wǎng)絡(luò)架構(gòu),將網(wǎng)站的內(nèi)容發(fā)布到最接近用戶的 cache服務(wù)器內(nèi),通過(guò)DNS負(fù)載均衡的技術(shù),判斷用戶來(lái)源就近訪問cache服務(wù)器取得所需的內(nèi)容,杭州的用戶訪問近杭州服務(wù)器上的內(nèi)容,北京的訪問 近北京服務(wù)器上的內(nèi)容。這樣可以有效減少數(shù)據(jù)在網(wǎng)絡(luò)上傳輸?shù)臅r(shí)間,提高速度。更詳細(xì)地內(nèi)容大家可以參考百度百科上對(duì)于CDN的解釋。Yahoo!把靜態(tài)內(nèi)容分布到CDN減少了用戶影響時(shí)間20%或更多。