新聞資訊

網站頁面性能優化的20條黃金守則

1、用<link>代替@import

前面的最佳實現(xiàn)中提到CSS應該放(fàng)置在頂端以利于有序加載呈現(xiàn)。      

在IE中,頁面底部@import和使用

作用是(shì)一樣的,因此最好不要使用它。


2、避免使用濾鏡      

IE獨有屬性AlphaImageLoader用于修正7.0以下版本中顯示PNG圖片的半透明效果。這個濾鏡的問題在于浏覽器加載圖片時它會終止内容的呈現(xiàn)并且凍結浏覽器。在每一個元素(不僅僅是(shì)圖片)它都會運算一次,增加了内存開支,因此它的問題是(shì)多方面的。      

完全避免使用AlphaImageLoader的最好方法就是(shì)使用PNG8格式來代替,這種格式能在IE中很好地工作。如果你确實需要使用AlphaImageLoader,請使用下劃線(xiàn)_filter又(yòu)使之對IE7以上版本的用戶無效。


3、把腳本置于頁面底部      

腳本帶來的問題就是(shì)它阻止了頁面的平行下載。HTTP/1.1 規範建議(yì),浏覽器每個主機名的并行下載内容不超過兩個。如果你的圖片放(fàng)在多個主機名上,你可以在每個并行下載中同時下載2個以上的文件。但(dàn)是(shì)當下載腳本時,浏覽器就不會同時下載其它文件了,即便是(shì)主機名不相(xiàng)同。      

在某些情況下把腳本移到頁面底部可能不太容易。比如說,如果腳本中使用了document.write來插入頁面内容,它就不能被往下移動了。這裏可能還會有作用域的問題。很多情況下,都會遇到這方面的問題。      

一個經常用到的替代方法就是(shì)使用延遲腳本。DEFER屬性表明腳本中沒有包含document.write,它告訴浏覽器繼續顯示。不幸的是(shì),Firefox并不支持DEFER屬性。在Internet Explorer中,腳本可能會被延遲但(dàn)效果也不會像我們所期望的那樣。如果腳本可以被延遲,那麽它就可以移到頁面的底部。這會讓你的頁面加載的快一點。


4、剔除重複腳本      

在同一個頁面中重複引用JavaScript文件會影響頁面的性能。你可能會認爲這種情況并不多見(jiàn)。對于美國前10大網站的調查顯示其中有兩家存在重複引用腳本的情況。有兩種主要因素導緻一個腳本被重複引用的奇怪現(xiàn)象發生:團隊規模和腳本數量。如果真的存在這種情況,重複腳本會引起不必要的HTTP請求和無用的JavaScript運算,這降低了網站性能。      

在Internet Explorer中會産生不必要的HTTP請求,而在Firefox卻不會。在Internet Explorer中,如果一個腳本被引用兩次而且它又(yòu)不可緩存,它就會在頁面加載過程中産生兩次HTTP請求。即時腳本可以緩存,當用戶重載頁面時也會産生額外的HTTP請求。      

除增加額外的HTTP請求外,多次運算腳本也會浪費(fèi)時間。在Internet Explorer和Firefox中不管腳本是(shì)否可緩存,它們都存在重複運算JavaScript的問題。      

一個避免偶爾發生的兩次引用同一腳本的方法是(shì)在模闆中使用腳本管理模塊引用腳本。在HTML頁面中使用

标簽引用腳本的最常見(jiàn)方法就是(shì):      

<script type="text/javascript" src="menu_1.0.17.js">

在PHP中可以通過創建名爲insertScript的方法來替代:      

爲了防止多次重複引用腳本,這個方法中還應該使用其它機制來處理腳本,如檢查所屬目錄和爲腳本文件名中增加版本号以用于Expire文件頭等。


5、減少DOM訪問      

使用JavaScript訪問DOM元素比較慢(màn),因此爲了獲得更多的應該頁面,應該做到:緩存已經訪問過的有關元素 線(xiàn)下更新完節點之後再将它們添加到文檔樹(shù)中 避免使用JavaScript來修改頁面布局      

有關此方面的更多信息請查看Julien Lecomte在YUI專題中的文章“高性能Ajax應該程序”。


6、開發智能事件處理程序      

有時候我們會感覺到頁面反應遲鈍,這是(shì)因爲DOM樹(shù)元素中附加了過多的事件句柄并且些事件句病被頻(pín)繁地觸發。這就是(shì)爲什麽說使用event delegation(事件代理)是(shì)一種好方法了。如果你在一個div中有10個按鈕,你隻需要在div上附加一次事件句柄就可以了,而不用去(qù)爲每一個按鈕增加一個句柄。事件冒泡時你可以捕捉到事件并判斷出是(shì)哪個事件發出的。      

你同樣也不用爲了操作DOM樹(shù)而等待onload事件的發生。你需要做的就是(shì)等待樹(shù)結構中你要訪問的元素出現(xiàn)。你也不用等待所有圖像都加載完畢。      

你可能會希望用DOMContentLoaded事件來代替onload,但(dàn)是(shì)在所有浏覽器都支持它之前你可使用YUI 事件應用程序中的onAvailable方法。


7、減小Cookie體積      

HTTP coockie可以用于權限驗證和個性化身份等多種用途。coockie内的有關信息是(shì)通過HTTP文件頭來在web服務器和浏覽器之間進行交流的。因此保持coockie盡可能的小以減少用戶的響應時間十分重要。 有關更多信息可以查看Tenni Theurer和Patty Chi的文章“When the Cookie Crumbles”。這們研究中主要包括:去(qù)除不必要的coockie 使coockie體積盡量小以減少對用戶響應的影響 注意在适應級别的域名上設置coockie以便使子域名不受影響 設置合理的過期時間。較早地Expire時間和不要過早去(qù)清除coockie,都會改善用戶的響應時間。


8、對于頁面内容使用無coockie域名      

當浏覽器在請求中同時請求一張靜态的圖片和發送coockie時,服務器對于這些coockie不會做任何地使用。因此他們隻是(shì)因爲某些負面因素而創建的網絡傳輸。所有你應該确定對于靜态内容的請求是(shì)無coockie的請求。創建一個子域名并用他來存放(fàng)所有靜态内容。      

如果你的域名是(shì)www.example.org,你可以在static.example.org上存在靜态内容。但(dàn)是(shì),如果你不是(shì)在www.example.org上而是(shì)在頂級域名example.org設置了coockie,那麽所有對于static.example.org的請求都包含coockie。在這種情況下,你可以再重新購買一個新的域名來存在靜态内容,并且要保持這個域名是(shì)無coockie的。Yahoo!使用的是(shì)ymig.com,YouTube使用的是(shì)ytimg.com,Amazon使用的是(shì)images-anazon.com等等。      

使用無coockie域名存在靜态内容的另外一個好處就是(shì)一些代理(服務器)可能會拒絕對coockie的内容請求進行緩存。一個相(xiàng)關的建議(yì)就是(shì),如果你想确定應該使用example.org還是(shì)www.example.org作爲你的一主頁,你要考慮到coockie帶來的影響。忽略掉www會使你除了把coockie設置到*.example.org(*是(shì)泛域名解析,代表了所有子域名譯者dudo注)外沒有其它選擇,因此出于性能方面的考慮最好是(shì)使用帶有www的子域名并且在它上面設置coockie。


9、優化圖像      

設計人員(yuán)完成對頁面的設計之後,不要急于将它們上傳到web服務器,這裏還需要做幾件事:你可以檢查一下你的GIF圖片中圖像顔色的數量是(shì)否和調色闆規格一緻。 使用imagemagick中下面的命令行很容易檢查: identify -verbose image.gif 如果你發現(xiàn)圖片中隻用到了4種顔色,而在調色闆的中顯示的256色的顔色槽,那麽這張圖片就還有壓縮的空間。

嘗試把GIF格式轉換成PNG格式,看看是(shì)否節省空間。大多數情況下是(shì)可以壓縮的。由于浏覽器支持有限,設計者們往往不太樂意使用PNG格式的圖片,不過這都是(shì)過去(qù)的事情了。現(xiàn)在隻有一個問題就是(shì)在真彩PNG格式中的alpha通道半透明問題,不過同樣的,GIF也不是(shì)真彩格式也不支持半透明。因此GIF能做到的,PNG(PNG8)同樣也能做到(除了動畫)。下面這條簡單的命令可以安全地把GIF格式轉換爲PNG格式: convert image.gif image.png “我們要說的是(shì):給PNG一個施展身手的機會吧!” 在所有的PNG圖片上運行pngcrush(或者其它PNG優化工具)。例如: pngcrush image.png -rem alla -reduce -brute result.png 在所有的JPEG圖片上運行jpegtran。這個工具可以對圖片中的出現(xiàn)的鋸齒等做無損操作,同時它還可以用于優化和清除圖片中的注釋以及其它無用信息(如EXIF信息): jpegtran -copy none -optimize -perfect src.jpg dest.jpg


10、優化CSS不要出現(xiàn)404錯誤  

Spirite在Spirite中水平排列你的圖片,垂直排列會稍稍增加文件大小; Spirite中把顔色較近的組合在一起可以降低顔色數,理想狀況是(shì)低于256色以便适用PNG8格式; 便于移動,不要在Spirite的圖像中間留有較大空隙。這雖然不大會增加文件大小但(dàn)對于用戶代理來說它需要更少的内存來把圖片解壓爲像素地圖。100x100的圖片爲1萬像素,而1000x1000就是(shì)100萬像素。

HTTP請求時間消耗是(shì)很大的,因此使用HTTP請求來獲得一個沒有用處的響應(例如404沒有找到頁面)是(shì)完全沒有必要的,它隻會降低用戶體驗而不會有一點好處。      

有些站點把404錯誤響應頁面改爲“你是(shì)不是(shì)要找***”,這雖然改進了用戶體驗但(dàn)是(shì)同樣也會浪費(fèi)服務器資源(如數據庫等)。最糟糕的情況是(shì)指向外部JavaScript的鏈接出現(xiàn)問題并返回404代碼。首先,這種加載會破壞并行加載;其次浏覽器會把試圖在返回的404響應内容中找到可能有用的部分當作JavaScript代碼來執行。


11、使用内容分發網絡      

用戶與你網站服務器的接近程度會影響響應時間的長短。把你的網站内容分散到多個、處于不同地域位置的服務器上可以加快下載速度。但(dàn)是(shì)首先我們應該做些什麽呢?      

按地域布置網站内容的第一步并不是(shì)要嘗試重新架構你的網站讓他們在分發服務器上正常運行。根據應用的需求來改變網站結構,這可能會包括一些比較複雜(zá)的任務,如在服務器間同步Session狀态和合并數據庫更新等。要想縮短用戶和内容服務器的距離(lí),這些架構步驟可能是(shì)不可避免的。      

要記住,在終端用戶的響應時間中有80%到90%的響應時間用于下載圖像、樣式表、腳本、Flash等頁面内容。這就是(shì)網站性能黃金守則。和重新設計你的應用程序架構這樣比較困難的任務相(xiàng)比,首先來分布靜态内容會更好一點。這不僅會縮短響應時間,而且對于内容分發網絡來說它更容易實現(xiàn)。      

内容分發網絡(Content Delivery Network,CDN)是(shì)由一系列分散到各個不同地理位置上的Web服務器組成的,它提高了網站内容的傳輸速度。用于向用戶傳輸内容的服務器主要是(shì)根據和用戶在網絡上的靠近程度來指定的。例如,擁有最少網絡跳(tiào)數(network hops)和響應速度最快的服務器會被選定。      

一些大型的網絡公司擁有自己的CDN,但(dàn)是(shì)使用像Akamai Technologies,Mirror Image Internet, 或者Limelight Networks這樣的CDN服務成本卻非常高。對于剛剛起步的企業和個人網站來說,可能沒有使用CDN的成本預算,但(dàn)是(shì)随着目标用戶群的不斷擴大和更加全球化,CDN就是(shì)實現(xiàn)快速響應所必需的了。以Yahoo來說,他們轉移到CDN上的網站程序靜态内容節省了終端用戶20%以上的響應時間。使用CDN是(shì)一個隻需要相(xiàng)對簡單地修改代碼實現(xiàn)顯著改善網站訪問速度的方法。


12、爲文件頭指定Expires或Cache-Control      

這條守則包括兩方面的内容: 對于靜态内容:設置文件頭過期時間Expires的值爲“Never expire”(永不過期) 對于動态内容:使用恰當的Cache-Control文件頭來幫助浏覽器進行有條件的請求      

網頁内容設計現(xiàn)在越來越豐富,這就意味着頁面中要包含更多的腳本、樣式表、圖片和Flash。第一次訪問你頁面的用戶就意味着進行多次的HTTP請求,但(dàn)是(shì)通過使用Expires文件頭就可以使這樣内容具有緩存性。它避免了接下來的頁面訪問中不必要的HTTP請求。Expires文件頭經常用于圖像文件,但(dàn)是(shì)應該在所有的内容都使用他,包括腳本、樣式表和Flash等。      

浏覽器(和代理)使用緩存來減少HTTP請求的大小和次數以加快頁面訪問速度。Web服務器在HTTP響應中使用Expires文件頭來告訴客戶端内容需要緩存多長時間。下面這個例子是(shì)一個較長時間的Expires文件頭,它告訴浏覽器這個響應直到2010年4月15日才過期。      Expires: Thu, 15 Apr 2010 20:00:00 GMT      如果你使用的是(shì)Apache服務器,可以使用ExpiresDefault來設定相(xiàng)對當前日期的過期時間。下面這個例子是(shì)使用ExpiresDefault來設定請求時間後10年過期的文件頭:      

ExpiresDefault "access plus 10 years"      

要切記,如果使用了Expires文件頭,當頁面内容改變時就必須改變内容的文件名。依Yahoo!來說我們經常使用這樣的步驟:在内容的文件名中加上版本号,如yahoo_2.0.6.js。      

使用Expires文件頭隻有會在用戶已經訪問過你的網站後才會起作用。當用戶首次訪問你的網站時這對減少HTTP請求次數來說是(shì)無效的,因爲浏覽器的緩存是(shì)空的。因此這種方法對于你網站性能的改進情況要依據他們“預緩存”存在時對你頁面的點擊頻(pín)率(“預緩存”中已經包含了頁面中的所有内容)。Yahoo!建立了一套測量方法,我們發現(xiàn)所有的頁面浏覽量中有75~85%都有“預緩存”。通過使用Expires文件頭,增加了緩存在浏覽器中内容的數量,并且可以在用戶接下來的請求中再次使用這些内容,這甚至都不需要通過用戶發送一個字節的請求。


13、Gzip壓縮文件内容      

網絡傳輸中的HTTP請求和應答時間可以通過前端機制得到顯著改善。的确,終端用戶的帶寬、互聯網提供者、與對等交換點的靠近程度等都不是(shì)網站開發者所能決定的。但(dàn)是(shì)還有其他因素影響着響應時間。通過減小HTTP響應的大小可以節省HTTP響應時間。      

從HTTP/1.1開始,web客戶端都默認支持HTTP請求中有Accept-Encoding文件頭的壓縮格式:Accept-Encoding: gzip, deflate      

如果web服務器在請求的文件頭中檢測到上面的代碼,就會以客戶端列出的方式壓縮響應内容。Web服務器把壓縮方式通過響應文件頭中的Content-Encoding來返回給浏覽器。    

Content-Encoding: gzip

Gzip是(shì)目前最流行也是(shì)最有效的壓縮方式。這是(shì)由GNU項目開發并通過RFC 1952來标準化的。另外僅有的一個壓縮格式是(shì)deflate,但(dàn)是(shì)它的使用範圍有限效果也稍稍遜色。

Gzip大概可以減少70%的響應規模。目前大約有90%通過浏覽器傳輸的互聯網交換支持gzip格式。如果你使用的是(shì)Apache,gzip模塊配置和你的版本有關:Apache 1.3使用mod_zip,而Apache 2.x使用moflate。      

浏覽器和代理都會存在這樣的問題:浏覽器期望收到的和實際接收到的内容會存在不匹配的現(xiàn)象。幸好,這種特殊情況随着舊(jiù)式浏覽器使用量的減少在減少。Apache模塊會通過自動添加适當的Vary響應文件頭來避免這種狀況的出現(xiàn)。      

服務器根據文件類型來選擇需要進行gzip壓縮的文件,但(dàn)是(shì)這過于限制了可壓縮的文件。大多數web服務器會壓縮HTML文檔。對腳本和樣式表進行壓縮同樣也是(shì)值得做的事情,但(dàn)是(shì)很多web服務器都沒有這個功能。實際上,壓縮任何一個文本類型的響應,包括XML和JSON,都值得的。圖像和PDF文件由于已經壓縮過了所以不能再進行gzip壓縮。如果試圖gizp壓縮這些文件的話(huà)不但(dàn)會浪費(fèi)CPU資源還會增加文件的大小。      

Gzip壓縮所有可能的文件類型是(shì)減少文件體積增加用戶體驗的簡單方法。


14、配置ETag      

Entity tags(ETags)(實體标簽)是(shì)web服務器和浏覽器用于判斷浏覽器緩存中的内容和服務器中的原始内容是(shì)否匹配的一種機制(“實體”就是(shì)所說的“内容”,包括圖片、腳本、樣式表等)。增加ETag爲實體的驗證提供了一個比使用“last-modified date(上次編輯時間)”更加靈活的機制。Etag是(shì)一個識别内容版本号的唯一字符串。唯一的格式限制就是(shì)它必須包含在雙引号内。原始服務器通過含有ETag文件頭的響應指定頁面内容的ETag。

HTTP/1.1 200 OK      Last-Modified: Tue, 12 Dec 2006 03:03:59 GMT   ETag: "10c24bc-4ab-457e1c1f"      Content-Length: 12195      

稍後,如果浏覽器要驗證一個文件,它會使用If-None-Match文件頭來把ETag傳回給原始服務器。在這個例子中,如果ETag匹配,就會返回一個304狀态碼,這就節省了12195字節的響應。      GET /i/yahoo.gif HTTP/1.1      Host: us.yimg.com      If-Modified-Since: Tue, 12 Dec 2006 03:03:59 GMT      If-None-Match: "10c24bc-4ab-457e1c1f"      HTTP/1.1 304 Not Modified      

ETag的問題在于,它是(shì)根據可以辨别網站所在的服務器的具有唯一性的屬性來生成的。當浏覽器從一台服務器上獲得頁面内容後到另外一台服務器上進行驗證時ETag就會不匹配,這種情況對于使用服務器組和處理請求的網站來說是(shì)非常常見(jiàn)的。默認情況下,Apache和IIS都會把數據嵌入ETag中,這會顯著減少多服務器間的文件驗證沖突。      

Apache 1.3和2.x中的ETag格式爲inode-size-timestamp。即使某個文件在不同的服務器上會處于相(xiàng)同的目錄下,文件大小、權限、時間戳等都完全相(xiàng)同,但(dàn)是(shì)在不同服務器上他們的内碼也是(shì)不同的。      

IIS 5.0和IIS 6.0處理ETag的機制相(xiàng)似。IIS中的ETag格式爲Filetimestamp:ChangeNumber。用ChangeNumber來跟蹤IIS配置的改變。網站所用的不同IIS服務器間ChangeNumber也不相(xiàng)同。 不同的服務器上的Apache和IIS即使對于完全相(xiàng)同的内容産生的ETag在也不相(xiàng)同,用戶并不會接收到一個小而快的304響應;相(xiàng)反他們會接收一個正常的200響應并下載全部内容。如果你的網站隻放(fàng)在一台服務器上,就不會存在這個問題。但(dàn)是(shì)如果你的網站是(shì)架設在多個服務器上,并且使用Apache和IIS産生默認的ETag配置,你的用戶獲得頁面就會相(xiàng)對慢(màn)一點,服務器會傳輸更多的内容,占用更多的帶寬,代理也不會有效地緩存你的網站内容。即使你的内容擁有Expires文件頭,無論用戶什麽時候點擊“刷新”或者“重載”按鈕都會發送相(xiàng)應的GET請求。      

如果你沒有使用ETag提供的靈活的驗證模式,那麽幹脆把所有的ETag都去(qù)掉會更好。Last-Modified文件頭驗證是(shì)基于内容的時間戳的。去(qù)掉ETag文件頭會減少響應和下次請求中文件的大小。微軟的這篇支持文稿講述了如何去(qù)掉ETag。在Apache中,隻需要在配置文件中簡單添加下面一行代碼就可以了:FileETag none


15、盡早刷新輸出緩沖      

當用戶請求一個頁面時,無論如何都會花費(fèi)200到500毫秒用于後台組織HTML文件。在這期間,浏覽器會一直空閑等待數據返回。在PHP中,你可以使用flush()方法,它允許你把已經編譯的好的部分HTML響應文件先發送給浏覽器,這時浏覽器就會可以下載文件中的内容(腳本等)而後台同時處理剩餘的HTML頁面。這樣做的效果會在後台煩惱或者前台較空閑時更加明顯。      

輸出緩沖應用最好的一個地方就是(shì)緊跟在之後,因爲HTML的頭部分容易生成而且頭部往往包含CSS和JavaScript文件,這樣浏覽器就可以在後台編譯剩餘HTML的同時并行下載它們。

爲了證明使用這項技術的好處,Yahoo!搜索率先研究并完成了用戶測試。


16、使用GET來完成AJAX請求      

Yahoo!Mail團隊發現(xiàn),當使用XMLHttpRequest時,浏覽器中的POST方法是(shì)一個“兩步走”的過程:首先發送文件頭,然後才發送數據。因此使用GET最爲恰當,因爲它隻需發送一個TCP包(除非你有很多cookie)。IE中URL的最大長度爲2K,因此如果你要發送一個超過2K的數據時就不能使用GET了。      

一個有趣的不同就是(shì)POST并不像GET那樣實際發送數據。根據HTTP規範,GET意味着“獲取”數據,因此當你僅僅獲取數據時使用GET更加有意義(從語意上講也是(shì)如此),相(xiàng)反,發送并在服務端保存數據時使用POST。


17、把樣式表置于頂部      

在研究Yahoo!的性能表現(xiàn)時,我們發現(xiàn)把樣式表放(fàng)到文檔的内部似乎會加快頁面的下載速度。這是(shì)因爲把樣式表放(fàng)到内會使頁面有步驟的加載顯示。      

注重性能的前端服務器往往希望頁面有秩序地加載。同時,我們也希望浏覽器把已經接收到内容盡可能顯示出來。這對于擁有較多内容的頁面和網速較慢(màn)的用戶來說特别重要。向用戶返回可視化的反饋,比如進程指針,已經有了較好的研究并形成了正式文檔。在我們的研究中HTML頁面就是(shì)進程指針。當浏覽器有序地加載文件頭、導航欄、頂部的logo等對于等待頁面加載的用戶來說都可以作爲可視化的反饋。這從整體上改善了用戶體驗。      

把樣式表放(fàng)在文檔底部的問題是(shì)在包括Internet Explorer在内的很多浏覽器中這會中止内容的有序呈現(xiàn)。浏覽器中止呈現(xiàn)是(shì)爲了避免樣式改變引起的頁面元素重繪。用戶不得不面對一個空白頁面。      

HTML規範清楚指出樣式表要放(fàng)包含在頁面的區域内:“和不同,隻能出現(xiàn)在文檔的區域内,盡管它可以多次使用它”。無論是(shì)引起白屏還是(shì)出現(xiàn)沒有樣式化的内容都不值得去(qù)嘗試。最好的方案就是(shì)按照HTML規範在文檔内加載你的樣式表。


18、避免使用CSS表達式(Expression)      

CSS表達式是(shì)動态設置CSS屬性的強大(但(dàn)危險)方法。Internet Explorer從第5個版本開始支持CSS表達式。下面的例子中,使用CSS表達式可以實現(xiàn)隔一個小時切換一次背景顔色:background-color: expression( (new Date()).getHours()%2 ? "#B8D4FF" : "#F08A00" ); 如上所示,expression中使用了JavaScript表達式。CSS屬性根據JavaScript表達式的計算結果來設置。expression方法在其它浏覽器中不起作用,因此在跨浏覽器的設計中單獨針對Internet Explorer設置時會比較有用。      

表達式的問題就在于它的計算頻(pín)率要比我們想象的多。不僅僅是(shì)在頁面顯示和縮放(fàng)時,就是(shì)在頁面滾動、乃至移動鼠标時都會要重新計算一次。給CSS表達式增加一個計數器可以跟蹤表達式的計算頻(pín)率。在頁面中随便移動鼠标都可以輕松達到10000次以上的計算量。      

一個減少CSS表達式計算次數的方法就是(shì)使用一次性的表達式,它在第一次運行時将結果賦給指定的樣式屬性,并用這個屬性來代替CSS表達式。如果樣式屬性必須在頁面周期内動态地改變,使用事件句柄來代替CSS表達式是(shì)一個可行辦法。如果必須使用CSS表達式,一定要記住它們要計算成千上萬次并且可能會對你頁面的性能産生影響。


19、使用外部JavaScript和CSS      

很多性能規則都是(shì)關于如何處理外部文件的。但(dàn)是(shì),在你采取這些措施前你可能會問到一個更基本的問題:JavaScript和CSS是(shì)應該放(fàng)在外部文件中呢還是(shì)把它們放(fàng)在頁面本身之内呢?      

在實際應用中使用外部文件可以提高頁面速度,因爲JavaScript和CSS文件都能在浏覽器中産生緩存。内置在HTML文檔中的JavaScript和CSS則會在每次請求中随HTML文檔重新下載。這雖然減少了HTTP請求的次數,卻增加了HTML文檔的大小。從另一方面來說,如果外部文件中的JavaScript和CSS被浏覽器緩存,在沒有增加HTTP請求次數的同時可以減少HTML文檔的大小。      

關鍵問題是(shì),外部JavaScript和CSS文件緩存的頻(pín)率和請求HTML文檔的次數有關。雖然有一定的難度,但(dàn)是(shì)仍然有一些指标可以一測量它。如果一個會話(huà)中用戶會浏覽你網站中的多個頁面,并且這些頁面中會重複使用相(xiàng)同的腳本和樣式表,緩存外部文件就會帶來更大的益處。      

許多網站沒有功能建立這些指标。對于這些網站來說,最好的堅決方法就是(shì)把JavaScript和CSS作爲外部文件引用。比較适合使用内置代碼的例外就是(shì)網站的主頁,如Yahoo!主頁和My Yahoo!。主頁在一次會話(huà)中擁有較少(可能隻有一次)的浏覽量,你可以發現(xiàn)内置JavaScript和CSS對于終端用戶來說會加快響應時 間。      

對于擁有較大浏覽量的首頁來說,有一種技術可以平衡内置代碼帶來的HTTP請求減少與通過使用外部文件進行緩存帶來的好處。其中一個就是(shì)在首頁中内置JavaScript和CSS,但(dàn)是(shì)在頁面下載完成後動态下載外部文件,在子頁面中使用到這些文件時,它們已經緩存到浏覽器了。


20、削減JavaScript和CSS      

精簡是(shì)指從去(qù)除代碼不必要的字符減少文件大小從而節省下載時間。消減代碼時,所有的注釋、不需要的空白字符(空格、換行、tab縮進)等都要去(qù)掉。在JavaScript中,由于需要下載的文件體積變小了從而節省了響應時間。精簡JavaScript中目前用到的最廣泛的兩個工具是(shì)JSMin和YUI Compressor。YUI Compressor還可用于精簡CSS。      

混淆是(shì)另外一種可用于源代碼優化的方法。這種方法要比精簡複雜(zá)一些并且在混淆的過程更易産生問題。在對美國前10大網站的調查中發現(xiàn),精簡也可以縮小原來代碼體積的21%,而混淆可以達到25%。盡管混淆法可以更好地縮減代碼,但(dàn)是(shì)對于JavaScript來說精簡的風險更小。      

除消減外部的腳本和樣式表文件外,