10+WEB前端優(yōu)化技巧
當(dāng)前位置:點(diǎn)晴教程→知識管理交流
→『 技術(shù)文檔交流 』
[p]隨著web2.0時代來,給網(wǎng)絡(luò)的帶來了空前的發(fā)展。前端用戶體驗(yàn)變得越來越顯的重要,從而來彌補(bǔ)b/s結(jié)構(gòu)的用戶交互型差的一些弊端,可是這樣會帶來一個問題就是會增加客戶端的壓力,比如大量運(yùn)用js代碼,大家都知道js代碼是運(yùn)行在客戶端的,會影響到整個網(wǎng)頁的在瀏覽器的解析效率,這樣也可能暗示著會增加客戶端的流量,所以不管是從服務(wù)器負(fù)載角度還是站在用戶的角度來看,對客戶端的代碼進(jìn)行優(yōu)化都顯得尤為重要!本文主要內(nèi)部和外部兩方面來闡述web前端優(yōu)化的方法。希望能給讀者一些體會和啟發(fā)。[/p]
[p]首先,我們通過一個雅虎的統(tǒng)計圖表來看看打開http://yahoo.com的http的流量數(shù)據(jù):[/p] [p][align=center][img]http://bbon.cn/wp-content/uploads/2009/06/web-yahoojpg.gif[/img][/align][/p] [p]我們可以發(fā)現(xiàn)一個頁面的從第一次發(fā)出服務(wù)器請求到完全載入到客戶端的過程中,讀取html代碼只占了整個響應(yīng)時間中的5%,這個結(jié)果適用于絕大多數(shù)網(wǎng)站,在采樣美國的前十位網(wǎng)站中,只有一家超過5%但少于20%,其余80%的時間是用來讀取網(wǎng)頁其他內(nèi)容的,也就是說,前端(原文是 front-end,意思就是不包括html代碼的其余內(nèi)容,可以是圖片,腳本,flash,視頻,各種東西)。這就是為什么我們要把目光集中在這些東西來提高顯示速度的關(guān)鍵原因。[/p] [p]為什么要從前端開始著手有三個主要原因:[/p] [p]這里有提升和改進(jìn)的潛力。如果能減少一半的體積,就能減少40%的響應(yīng)時間。[/p] [p]改進(jìn)前端比改進(jìn)后端需要的時間和資源更少。(改進(jìn)后端要重新設(shè)計應(yīng)用程序規(guī)劃,代碼,尋找優(yōu)化代碼的方法,添加或改變硬件配置,分布式數(shù)據(jù)庫,等等)[/p] [p]我們的黃金規(guī)則是:首先優(yōu)化前端表現(xiàn),這些東西耗費(fèi)了用戶端響應(yīng)時間中的80%。[/p] [p]一、從代碼之外,咱們有以下三種方法[/p] [p]1.運(yùn)用cdn技術(shù)[/p] [p]具體方式,可以google一下。(大體的原理好像就是判斷訪問者的位置及訪問的內(nèi)容從而來選擇就近的服務(wù)器來處理用戶的請求)[/p] [p]2.加一個長時間過期的頭部[/p] [p]expires: thu, 15 apr 2010 20:00:00 gmt[br]瀏覽器會用緩存來減少http請求數(shù)來加快頁面加載的時間,如果頁面頭部加一個很長的過期時間,瀏覽器就會一直緩存頁面里的元素。[br]不過這樣會帶來一個問題,就是如果頁面里的東西變動的話就要改名字了,否則用戶端不會主動刷新,在yahoo工作組用的是版本號,例如yahoo_2.0.6.js[/p] [p]3.gzip壓縮[/p] [p]gzip是現(xiàn)在最流行和最有效的壓縮方式,她是gnu開發(fā)的,rfc1952標(biāo)準(zhǔn)化。[br](gzip是在服務(wù)器端壓縮圖片,css,腳本等,傳送到用戶端的瀏覽器再解壓,這樣可以提高傳輸速度,不過對服務(wù)器的壓力會增大,一般選擇部分元素壓縮比較合適。)[/p] [p]4.避免重定向[/p] [p]重定向會減慢用戶體驗(yàn),它會延遲所有的東西直至到達(dá)新頁面。一個最浪費(fèi)的重定向經(jīng)常會發(fā)生而我們的開發(fā)者又會經(jīng)常忽略的就是比如 http://astrology.yahoo.com/astrology的結(jié)果是重定向到http://astrology.yahoo.com /astrology/ 在apache里用alias 或者mod_rewrite或者directoryslash解決。[br]從一個舊網(wǎng)站跳轉(zhuǎn)到新網(wǎng)站也是經(jīng)常要用到重定向,還有就是連接一個網(wǎng)站中的不同部分和在某些情況下(比如不同瀏覽器,不同的用戶帳號類型,等等)的用戶導(dǎo)向。用重定向很簡單,而且只需要一點(diǎn)額外的代碼,雖然在這些情況下用重定向減少了開發(fā)者的復(fù)雜度,但它降低了用戶的體驗(yàn),變通的做法是用alias和 mod_rewrite如果兩個部分是在同一主機(jī)上的話,如果是由域名變更引起的重定向,變通的做法是通過alias或mod_rewrite創(chuàng)建一個 cname(一個dns記錄,創(chuàng)建一個別名,從一個域名指向另一個域名)[/p] [p]5.配置etags[/p] [p]etags(entity tags)是服務(wù)器和瀏覽器的一個功能,它用來判斷瀏覽器緩存里的元素是否和原來服務(wù)器上的一致。etags比last-modified date更具有彈性,它用一個獨(dú)一無二的字符串來標(biāo)識一個元素的版本。[br]源服務(wù)器用響應(yīng)頭里的etag來特定一個元素的etag:[br]http/1.1 200 ok[br]last-modified: tue, 12 dec 2006 03:03:59 gmt[br]etag: “10c24bc-4ab-457e1c1f”[br]content-length: 12195[br]之后,如果瀏覽器要驗(yàn)證這個元素,它就會用if-none-match頭來回傳etag到源服務(wù)器。如果符合的話,一個304狀態(tài)的代碼就會從源服務(wù)器返回到瀏覽器,這樣源服務(wù)器就節(jié)省了傳輸具體數(shù)據(jù)的開銷。[br]get /i/yahoo.gif http/1.1[br]host: us.yimg.com[br]if-modified-since: tue, 12 dec 2006 03:03:59 gmt[br]if-none-match: “10c24bc-4ab-457e1c1f”[br]http/1.1 304 not modified[/p] [p]用etags的問題就在于它會標(biāo)識那個特定的服務(wù)器,如果換了服務(wù)器,etags也就失去了原有的功能,但是這種現(xiàn)在在網(wǎng)絡(luò)上太常見了,因?yàn)槲覀兘?jīng)常用服務(wù)器集群。默認(rèn)情況下,apache和iis會在etag中內(nèi)嵌數(shù)據(jù),這樣會動態(tài)減少驗(yàn)證成功的機(jī)會。[/p] [p]apache1.3和2.x的etag格式是inode-size-timestamp。雖然一個文件可能在不同服務(wù)器的同一個目錄,同樣的大小,安全級,時間戳等等,它的inode會隨著服務(wù)器的不同而不同。[/p] [p]iis5.0和6.0有同樣類似etags的東西,叫時間戳:changenumber(更改號),更改號是一個用來追蹤iis配置變化的計數(shù)器,changenumber在不同iis服務(wù)器之間是不一樣的。[/p] [p]它最終的問題就是,iis和apache產(chǎn)生的etags會在不同服務(wù)器之間無法匹配,這樣我們的瀏覽器就無法得到我們期待的304響應(yīng),而給我們的是一個普通的200響應(yīng),和正常的數(shù)據(jù)流。如果你的網(wǎng)站只有一個服務(wù)器還無所謂,如果是集群,而你用的是默認(rèn)的etag配置,你的用戶就會獲得更慢的頁面,你的服務(wù)器也會有更高的負(fù)載,消耗更大的帶寬資源,代理也無法高效緩存你的內(nèi)容,甚至即使你有一個長時間過期的頭部(按:見第三條規(guī)則),也不會阻止它重新載入內(nèi)容。[/p] [p]如果你不想發(fā)揮etags提供的這個彈性驗(yàn)證模型的優(yōu)勢,你最好關(guān)掉它。apache中關(guān)掉它的方法是在apache的配置文件中寫這么一句:[br]fileetag none[/p] [p]二、我們從代碼方面來探討有如下方法[/p] [p]1.減少http請求數(shù)[/p] [p]圖片,css,script,flash,等等這些都會增加http請求數(shù),減少這些元素的數(shù)量能減少響應(yīng)時間。[/p] [p]css sprites技術(shù)能減少圖片的請求數(shù),把零散的小圖片放到一起,運(yùn)用background-position來改變背景圖片的位置,前提是html元素事先定義好寬高,其實(shí)就像一個遮罩,移動背景就會看到不同的景象。[/p] [p]內(nèi)嵌圖像 用data:url scheme的方式把圖片內(nèi)容代碼直接嵌入html代碼中,這樣會增大html代碼的體積,改進(jìn)的方式是把內(nèi)嵌圖片嵌入到css中(css被緩存),這樣就會更好的減少http請求數(shù)而且不增大html的體積。[/p] [p]很多用戶都是在空緩存的情況下進(jìn)入你的網(wǎng)站的,這樣第一次的速度就會顯得很重要。[/p] [p]第一條規(guī)則是最重要的一條規(guī)則。[/p] [p]2.把樣式表放到頂部[/p] [p]我們發(fā)現(xiàn)把css放到文檔頭部會讓網(wǎng)頁加載得更快。因?yàn)檫@樣可以讓頁面逐漸加載。[br]把樣式表放到接近底部的問題是它阻止了頁面元素的逐漸顯示。這樣還會導(dǎo)致“flash of unstyled content” 即在樣式表加載之前頁面內(nèi)容是以沒有樣式的形式顯示出來的,待加載完樣式后,頁面重繪,內(nèi)容一閃即改變了樣式表現(xiàn)。[/p] [p]3.把腳本放到底部[/p] [p]把腳本放到盡可能底部的地方,一個原因是讓頁面逐漸渲染,另一個是實(shí)現(xiàn)更好的并行下載。[/p] [p]對于腳本,腳本以下的內(nèi)容被阻止逐漸加載了,因?yàn)橹挥挟?dāng)下載完腳本以后才會下載下面的內(nèi)容,第二個腳本引起的問題是阻止平行下載。 “http/1.1 specification”建議瀏覽器對一個域名,同一時間下載數(shù)不超過2個(按:實(shí)際監(jiān)測發(fā)現(xiàn)一般有超過2個),我曾經(jīng)讓ie并行下載100個圖片。當(dāng)腳本正在下載的時候,瀏覽器不會開始下載任何東西。[/p] [p]4.避免css expressions[/p] [p]css expressions 是一個有力(和危險)的方式動態(tài)的改變css的屬性。他們自ie5就開始被支持,舉個例子,用css expression可以讓背景色每個小時輪換一次。但是被非ie瀏覽器忽略的。[/p] [p]background-color: expression( (new date()).gethours()%2 ? “#b8d4ff” : “#f08a00″ );[/p] [p]expressions的問題就在與它的計算頻率絕對超出我們的想象,甚至當(dāng)我們移動鼠標(biāo),都會引起頁面的重繪![/p] [p]下面是舉例頁面[/p] [p]減少css expressions計算次數(shù)的一個方法就是使用一次性的expressions。 當(dāng)?shù)谝淮蝒xpression計算出一個明確的值,就讓樣式等于這個值,不再變動。如果樣式的屬性一定要動態(tài)的改變,就用時間句柄吧![/p] [p]5.讓腳本和樣式外延[/p] [p]javascript和css應(yīng)該是外部調(diào)用還是內(nèi)嵌呢?[br]用外部調(diào)用文件的方式更快,因?yàn)樗麄兪强梢员痪彺娴模绻莾?nèi)嵌在頁面中他們就無法被緩存了!想想如果用戶要在你的網(wǎng)站看很多很多的頁面,如果都是使用同一個外部腳本和樣式,那么他們一旦被緩存,就再也不需要下載了,這樣會給你帶來很大的潛在好處。[/p] [p]6.減小腳本體積[/p] [p]有兩個比較流行的工具是用來減小腳本的體積的–jsmin和yui compressor。(按:這個壓縮和gzip壓縮是不一樣的,gzip是傳輸壓縮,這個是代碼壓縮)。[/p] [p]我們以上方法,讀者應(yīng)該適當(dāng)?shù)倪x擇或配合使用,我們在選擇方法的原則是應(yīng)該以最低的代價來完成客戶端的功能。[/p] [p]原文:[url=http://hi.baidu.com/mj_623ok/blog/item/a843d8de288d601b632798b8.html][i][i]web前端優(yōu)化的體會[/i][/i][/url][/p] 該文章在 2010/4/27 2:04:48 編輯過 |
關(guān)鍵字查詢
相關(guān)文章
正在查詢... |