14条Yahoo(雅虎)十四条优化原则【转】
Web?應用性能優化黃金法則:先優化前端程序?(front-end)?的性能,因為這是80%?或以上的最終用戶響應時間的花費所在。
法則1:?減少HTTP請求次數
80%的最終用戶響應時間花在前端程序上,而其大部分時間則花在各種頁面元素,?如圖像、?樣式表、?腳本和?Flash?等的下載上。?減少頁面元素將會減少?HTTP?請求?次數。這是快速顯示頁面的關鍵所在。一種減少頁面元素個數的方法是簡化頁面設計。?但是否存在其他方式,能做到既有豐富內容,又能獲得快速響應時間呢?以下是這樣一些技術:image maps?組合,多個圖片到一張圖片中。總文件大小變化不大,但減少了HTTP?請求次數從而加快了頁面顯示速度。?該方式只適合圖片連續的情況;同時坐標的定義是煩人又容易出錯的工作。?CSS Sprites?是更好的方法。它可以組合頁面中的圖片到單個文件中,并使用?CSS?的?background-image?和?background-position?屬性來現實所需的部分圖片。?inline images?使用?data: URL scheme?來在頁面中內嵌圖片。這將增大HTML文件的大小。組合?inline images?到你的(緩存)樣式表是既能較少HTTP請求,又能避免加大HTML文件大小的方法。?Combined files?通過組合多個腳本文件到單一文件來減少?HTTP?請求次數。樣式?表也可采用類似方法處理。?這個方法雖然簡單,但沒有得到大規模的使用。美國網站每頁平均有7個腳本文件和2個樣式表。當頁面之間腳本和樣式表變化很大時,該方式將遇到很大的挑戰,但如果做到的話,將能加快響應時間。?減少HTTP請求次數是性能優化的起點。這最提高首次訪問的效率起到很重要的作用。?Tenni Theurer?的文章?Browser Cache Usage – Exposed!描述,40-60%?據的日常訪問是首次訪問,因此為首次訪問者加快頁面訪問速度是用戶體驗的關鍵。
法則2:?使用?CDN(Content Delivery Network,?內容分發網絡?)
用戶離?web server?的遠近對響應時間也有很大影響。從用戶角度看,把內容部署到多個地理位置分散的服務器上將有效提高頁面裝載速度。?但是該從哪里開始呢?
作為實現內容地理分布的第一步,不要試圖重構?web?應用以適應分布架構。?改變?架構將導致多個周期性任務,如同步session狀態,在多個server之間復制數據庫交易。?這樣縮短用戶與內容距離的嘗試可能被應用架構改版所延遲,或阻止。?我們還記得?80-90%的最終用戶響應時間花在下載頁面中的各種元素上,如圖像文件、?樣式表、?腳本和Flash等。?與其花在重構系統這個困難的任務上,還不如先分布靜態內容。?這不僅能大大減少響應時間,而且由于CDN的存在,分布靜態內容非常容易實現。?CDN是地理上分布的web server的集合,用于更高效地發布內容。?通常基于網絡遠近來選擇給具體用戶服務的?web server。?一些大型網站擁有自己的CDN,但是使用如?Akamai Technologies, Mirror Image Internet,?或?Limelight Networks?等?CDN?服務提供商的服務將是劃算的。?在Yahoo!把靜態內容分布到?CDN減少了用戶影響時間?20%或更多。切換到CDN的代碼修改工作是很容易的,但能達到提高網站的速度。
法則3:增加?Expires Header
網頁內容正變得越來越豐富,這意味著更多的腳本文件、樣式表、圖像文件和?Flash。首次訪問者將不得不面臨多次HTTP請求,但通過使用Expires header,?您可以在客戶端緩存這些元素。這在后續訪問中避免了不必要的HTTP請求。?Expires header?最常用于圖像文件,但是它也應該用于腳本文件、樣式表和?Flash。?瀏覽器(和代理)使用緩存來減少?HTTP?請求的次數和大小,使得網頁加速裝載。?Web server?通過?Expires header?告訴客戶端一個元素可以緩存的時間長度。?如果服務器是Apache?的話,您可以使用?ExpiresDefault?基于當期日期來設置過期日期,如:?ExpiresDefault “access plus 10 years”?設置過期時間為從請求時間開始計算的10?年。請記住,如果使用超長的過期時間,則當內容改變時,您必須修改文件名稱。?在?Yahoo!我們經常把改名作為release?的一個步驟:版本號內嵌在文件名中,如?yahoo_2.0.6.js。
法則4:壓縮頁面元素
通過壓縮HTTP響應內容可減少頁面響應時間。從?HTTP/1.1?開始,web客戶端在?HTTP請求中通過?Accept-Encoding?頭來表明支持的壓縮類型,如:
Accept-Encoding: gzip, deflate.?如果?Web server?檢查到?Accept-Encoding?頭,它會使用客戶端支持的方法來壓?縮?HTTP?響應,會設置?Content-Encoding?頭,如:Content-Encoding: gzip。?Gzip?是目前最流行及有效的壓縮方法。?其他的方式如deflate,但它效果較差,也不夠流行。通過?Gzip,內容一般可減少?70%。如果是Apache,在?1.3?版本下需?使用?mod_gzip?模塊,而在?2.x?版本下,則需使用mod_deflate。?Web server?根據文件類型來決定是否壓縮。?大部分網站對?HTML?文件進行壓縮。?但?對腳本文件和樣式表進行壓縮也是值得的。實際上,對包括?XML?和JSON?在內的任務文本信息進行壓縮都是值得的。?圖像文件和?PDF?文件不應該被壓縮,因為它?們本來就是壓縮格式保存的。對它們進行壓縮,不但浪費?CPU,而且還可能增加?文件的大小。?因此,對盡量多的文件類型進行壓縮是一種減少頁面大小和提高用戶體驗的簡?便方法。
法則5:?把樣式表放在頭上
我們發現把樣式表移到HEAD部分可以提高界面加載速度,因此這使得頁面元素可以順序顯示。?在很多瀏覽器下,如?IE,把樣式表放在?document?的底部的問題在于它禁止了網頁內容的順序顯示。?瀏覽器阻止顯示以免重畫頁面元素,那用戶只能看到空白頁了。Firefox?不會阻止顯示,但這意味著當樣式表下載后,有些頁面元素可能需要重畫,這導致閃爍問題。?HTML?規范明確要求樣式表被定義在HEAD?中,因此,為避免空白屏幕或閃爍問題,?最好的辦法是遵循HTML規范,把樣式表放在HEAD中。
法則6:把腳本文件放在底部
與樣式文件一樣,我們需要注意腳本文件的位置。?我們需盡量把它們放在頁面的底部,這樣一方面能順序顯示,另方面可達到最大的并行下載。?瀏覽器會阻塞顯示直到樣式表下載完畢,因此我們需要把樣式表放在?HEAD部分。?而對于腳本來說,腳本后面內容的順序顯示將被阻塞,因此把腳本盡量放在底部意味著更多內容能被快速顯示。腳本引起的第二個問題是它阻塞并行下載數量。HTTP/1.1?規范建議瀏覽器每個主機的并行下載數不超過2?個。?因此如果您把圖像文件分布到多臺機器的話,您可以達到超過2個的并行下載。?但是當腳本文件下載時,瀏覽器不會啟動其他的并行下載,甚至其他主機的下載也不啟動。?在某些情況下,不是很容易就能把腳本移到底部的。如,腳本使用?document.write?方法來插入頁面內容。?同時可能還存在域的問題。?不過在很多情況下,還是有一些方法的。?一個備選方法是使用延遲腳本(deferred script)。DEFER屬性表明腳本未包含?document.write,指示瀏覽器刻繼續顯示。不幸的是,Firefox?不支持?DEFER?屬性。?IE中,腳本可能被延遲執行,但不一定得到需要的長時間延遲。在不過從另外角度來說,如果腳本能被延遲執行,那它就可以被放在底部了。
法則7:避免?CSS?表達式
CSS?表達式是功能強大的(同時也是危險的)用于動態設置CSS屬性的方式。IE從版本5開始支持?CSS?表達式,如?backgourd-color: expression((new Date()).getHours()%2?”#B8D4FF”:”#F08A00”),即背景色每個小時切換一次。?CSS表達式的問題是其執行次數超過大部分人的期望。?不僅頁面顯示和?resize?時計算表達式,而且當頁面滾屏,甚至當鼠標在頁面上移動時都會重新計算表達式。?一種減少CSS表達式執行次數的方法是一次性表達式,即當第一次執行時就以明確的數值代替表達式。如果必須動態設置的話,可使用事件處理函數代替。如果您必須使用CSS表達式的話,請記住它們可能被執行上千次,從而影響頁面性能。
法則8:把JavaScript和CSS放到外部文件中
上述很多性能優化法則都基于外部文件進行優化。現在,我們必須問一個問題:JavaScript?和CSS應該包括在外部文件,還是在頁面文件中?在現實世界中,使用外部文件會加快頁面顯示速度,因為外部文件會被瀏覽器緩存。如果內置JavaScript?和CSS?在頁面中雖然會減少HTTP請求次數,但增大了頁面的大小。?另外一方面,使用外部文件,會被瀏覽器緩存,則頁面大小會減小,同時又不增加?HTTP?請求次數。?因此,一般來說,外部文件是更可行的方式。?唯一的例外是內嵌方式對主頁更有效,如Yahoo!和My Yahoo!都使用內嵌方式。一般來說,在一個?session中,主頁訪問此時較少,因此內嵌方式可以取得更快的用戶響應時間。
法則9:減少DNS查詢次數
DNS用于映射主機名和IP地址,一般一次解析需要?20~120?毫秒。?為達到更高的性能,DNS解析通常被多級別地緩存,如由ISP或局域網維護的caching server,本地機器操作系統的緩存(如?windows?上的?DNS Client Service)瀏覽器的缺省?DNS?緩存時間為30分鐘,Firefox的缺省緩沖時間是1分鐘。?IE減少主機名可減少DNS?查詢的次數,但可能造成并行下載數的減少。避免DNS查詢可減少響應時間,而減少并行下載數可能增加響應時間。?一個可行的折中是把內容分布到至少2?個,最多4個不同的主機名上。
法則10:最小化JavaScript代碼
最小化JavaScript代碼指在JS代碼中刪除不必要的字符,從而降低下載時間。?兩個流行的工具是JSMin?和YUI Compressor。?混淆是最小化于源碼的備選方式。?象最小化一樣,它通過刪除注釋和空格來減少源碼大小,同時它還可以對代碼進行混淆處理。?作為混淆的一部分,函數名和變量名被替換成短的字符串,這使得代碼更緊湊,同時也更難讀,使得難于被反向工程。Dojo Compressor (ShrinkSafe)是最常見的混淆工具。?最小化是安全的、直白的過程,而混淆則更復雜,而且容易產生問題。從對美國10大網站的調查來看,通過最小化,文件可減少?21%,而混淆則可減少25%。?除了最小化外部腳本文件外,內嵌的腳本代碼也應該被最小化。?即使腳本根據法則4被壓縮后傳輸,最小化腳本刻減少文件大小?5%或更高。
法則11:?避免重定向
重定向功能是通過301和302這兩個HTTP狀態碼完成的,如:HTTP/1.1 301 Moved Permanently Location: http://example.com/newuri Content-Type: text/html?瀏覽器自動重定向請求到?Location?指定的?URL?上,重定向的主要問題是降低了?用戶體驗。?一種最耗費資源、經常發生而很容易被忽視的重定向是URL的最后缺少,如訪?問http://astrology.yahoo.com/astrology?將被重定向到
http://astrology.yahoo.com/astrology/。在?Apache?下,可以通過Alias,mod_rewrite或?DirectorySlash?等方式來解決該問題。
法則12:刪除重復的腳本文件
在一個頁面中包含重復的JS腳本文件會影響性能,即它會建立不必要的HTTP請求和額外的JS執行。?不必要的HTTP請求發生在IE?下,而?Firefox?不會產生多余的HTTP請求。?額外的JS執行,不管在IE下,還是在Firefox下,都會發生。?一個避免重復的腳本文件的方式是使用模板系統來建立腳本管理模塊。?除了防止?重復的腳本文件外,該模塊還可以實現依賴性檢查和增加版本號到腳本文件名中,從而實現超長的過期時間。
法則13:配置?ETags
ETags?是用于確定瀏覽器緩存中元素是否與?Web server?中的元素相匹配的機制,?它是比?last-modified date?更靈活的元素驗證機制。ETag?是用于唯一表示元素版本的字符串,它需被包括在引號中。Web server?首先在?response?中指定?ETag:?HTTP/1.1 200 OK < 03:03:59 2006 Dec 12> 10c24bc-4ab-457e1c1f” Content-Length: 12195后來,如果瀏覽器需要驗證某元素,它使用?If-None-Match?頭回傳?ETag?給?Web server,如果?ETag?匹配,則服務器返回304代碼,從而節省了下載時間:GET /i/yahoo.gif HTTP/1.1 Host: us.yimg.com < 03:03:59 2006 Dec 12> 10c24bc-4ab-457e1c1f” HTTP/1.1 304 Not Modified ETags?的問題在于它們是基于服務器唯一性的某些屬性構造的,如?Apache1.3?和?2.x,其格式是?inode-size-timestamp,而在?IIS5.0和?6.0?下,其格式是?Filetimestamp:ChangeNumber。這樣同一個元素在不同的?web server?上,其?ETag?是不一樣的。這樣在多?Web server?的環境下,瀏覽器先從server1?請求某?元素,后來向?server2?驗證該元素,由于?ETag?不同,所以緩存失效,必須重新?下載。
因此,如果您未用到?ETags?系統提供的靈活的驗證機制,最好刪除?ETag。刪除?ETag會減少?http response?及后續請求的?HTTP?頭的大小。微軟支持文章描述了?如何刪除ETags,而在?Apache?下,只要在配置文件中設置?FileETag none?即可。
法則14:緩存?Ajax
性能優化法則同樣適用于web 2.0?應用。提高Ajax的性能最重要的方式是使得其response?可緩存,就像“法則3”增加?Expires Header”討論的那樣。以下其他法則同樣適用于?Ajax,當然“法則3”是最有效的方式:
轉載于:https://www.cnblogs.com/fashion1993/p/4044975.html
總結
以上是生活随笔為你收集整理的14条Yahoo(雅虎)十四条优化原则【转】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MyEclipse设置像visual s
- 下一篇: 从web编辑器 UEditor 中单独提