原文地址:
http://jiajun.javaeye.com/blog/405166
http://hi.baidu.com/susefans/blog/item/e429aa312fd8abae5edf0eaf.html
今天突然發(fā)現(xiàn)一篇好文章Best Practices for Speeding Up Your Web Site
地址是:http://developer.yahoo.com/performance/rules.html
寫的確實好,下面是摘抄自網(wǎng)上的資料,來份簡單的中文版供參考。
- Web前端優(yōu)化最佳實踐之Content篇
Yahoo! 的 Exceptional Performance team 在 Web 前端方面作出了卓越的貢獻(xiàn)。廣為人知的優(yōu)化規(guī)則也由 13 條到 14 條,再到 20 條,乃至現(xiàn)在的 34 條–真是與時俱進(jìn)啊。最新的 34 條也針對不同的角度做了分類。
面向內(nèi)容的優(yōu)化規(guī)則目前有 10 條。
- 盡量減少 HTTP 請求 (Make Fewer HTTP Requests)
作為第一條,可能也是最重要的一條。根據(jù) Yahoo! 研究團(tuán)隊的數(shù)據(jù)分析,有很大一部分用戶訪問會因為這一條而取得最大受益。有幾種常見的方法能切實減少 HTTP 請求:
1) 合并文件 ,比如把多個CSS/javascript文件合成一個;
2) CSS Sprites 利用 CSS background 相關(guān)元素進(jìn)行背景圖絕對 定位;參見:CSS Sprites: Image Slicing’s Kiss of Death
3) 圖像地圖
4) 內(nèi)聯(lián)圖象 使用 data: URL scheme 在實際的頁面嵌入圖像數(shù)據(jù). - 減少 DNS 查找 (Reduce DNS Lookups)
必須明確的一點,DNS 查找的開銷是很大的。另外,我倒是覺得這是 Yahoo! 所有站點的通病,Yahoo!主站點可能還不夠明顯,一些分站點,存在明顯的類似問題。對于國內(nèi)站點來說,如果過多的使用了站外的 Widget ,也很容易引起過多的DNS查找問題。 - 避免重定向 (Avoid Redirects)
不是絕對的避免,盡量減少。另外,應(yīng)該注意一些不必要的重定向。比如對 Web 站點子目錄的后面添加個 / (Slash) ,就能有效避免一次重定向。http://www.dbanotes.net/arch 與 http://www.dbanotes.net/arch/ 二者之間是有差異的。如果是 Apache 服務(wù)器,通過配置 Alias 或mod_rewrite 或是 DirectorySlash 能夠消除這個問題。 - 使得 Ajax 可緩存 (Make Ajax Cacheable)
響應(yīng)時間對 Ajax 來說至關(guān)重要,否則用戶體驗絕對好不到哪里去。提高響應(yīng)時間的有效手段就是 Cache 。其它的一些優(yōu)化規(guī)則對這一條也是有效的。 - 延遲載入組件 (Post-load Components)
- 預(yù)載入組件 (Preload Components)
上面兩條嚴(yán)格說來,都是屬于異步 這個思想靈活運用的事兒。 - 減少DOM元素數(shù)量 (Reduce the Number of DOM Elements)
- 切分組件到多個域 (Split Components Across Domains)
主要的目的是提高頁面組件并行下載能力。但不要跨太多域名,否則就和第二條有些沖突了。 - 最小化iframe的數(shù)量 (Minimize the Number of iframes)
熟悉SEO的朋友知道 iframe 是 SEO 的大忌。針對前端優(yōu)化來說 iframe 有其好處,也有其弊端,一分為二看問題吧。 - 杜絕 http 404 錯誤 (No 404s)
對頁面鏈接的充分測試加上對 Web 服務(wù)器 error 日志的不斷跟蹤能有效減少 404 錯誤,亦能提升用戶體驗。值得一提的是,CSS 與 Java Script 引起的 404 錯誤因為定位稍稍”難”一點而往往容易被忽略。
對于內(nèi)容的設(shè)計應(yīng)該優(yōu)先考慮可被緩存的靜態(tài)化處理。靜態(tài)化后不僅提高響應(yīng)效率,還節(jié)省大量的服務(wù)器投入。web 2.0 的應(yīng)用,則需要充分結(jié)合 js 給靜態(tài)頁面增強動態(tài)性。這些優(yōu)化細(xì)節(jié)處理很多,但能獲取很高的收益 :)
- Web 前端優(yōu)化最佳實踐之 Server 篇
Web 前端優(yōu)化最佳實踐第二部分面向 Server 。目前共計有 6 條實踐規(guī)則。【注,這最多算技術(shù)筆記,查看最原始內(nèi)容,還請訪問:Exceptional Performance : Best Practices for Speeding Up Your Web Site 】
- 使用 CDN (Use a Content Delivery Network)
國內(nèi) CDN 的普及還不夠。不過我們有獨特的電信、網(wǎng)通之間的問題 ,如果針對這個作優(yōu)化,基本上也算能收到 CDN 或類似的效果吧(假裝如此)。【Tin 說國內(nèi) CDN 用的挺多,看看 CDN 廠商的市場就知道了,還沒走入尋常百姓家】 - 添加 Expires 或 Cache-Control 信息頭 (Add an Expires or a Cache-Control Header)
各個瀏覽器都有針對的方案, Apache 例子【注意:下面的說明例子還不夠精細(xì),具體的環(huán)境上還要加一些調(diào)整】:
ExpiresActive On ExpiresByType image/gif “modification plus 1 weeks”
Lighttpd 啟用 mod_expire 模塊 后:
$HTTP["url"] =~ "\.(jpg|gif|png)$" { expire.url = ( "" => "access 1 years" ) }
Nginx 例子參考:
location ~* \.(jpg|gif|png)$ { if (-f $request_filename) { expires max; break; } }
- 壓縮內(nèi)容 (Gzip Components)
對于絕大多數(shù)站點,這都是必要的一步,能有效減輕網(wǎng)絡(luò)流量壓力?;蛟S有人擔(dān)心對 CPU 壓縮對于 CPU 的影響,放心大膽的整吧,沒事兒。Nginx 例子:
gzip on; gzip_types text/plain text/html text/css ext/javascript;
- 設(shè)置 Etags (Configure ETags)
對于 Etag ,可能是多數(shù)網(wǎng)站維護(hù)者都會忽略的地方。在這一系列優(yōu)化規(guī)則出現(xiàn)之前,可能互聯(lián)網(wǎng)上絕大多數(shù)站點都對這個問題忽略了。當(dāng)然,Etag 對多數(shù)站點性能的影響并不是很大。除非是面向 RSS 的網(wǎng)站?!究吹接信笥雅u說寫的簡略,并且說 IE 不支持 ETag。明確說一下:IE 支持 ETag,倒是使用 IIS 要注意相關(guān) Etag Bug。】
補充:我的意思是”很多網(wǎng)站在不注意的情況下都是打開 Etag 的,而沒有網(wǎng)站關(guān)心如何用,消耗資源而不知。并不是說 Etag 不好,合理利用 Etag ,絕對能取得很好的收益.
- 盡早刷新 Buffer (Flush the Buffer Early)
對這一條,琢磨了半天,貌似還是異步 的思路。能更好的提升用戶體驗? - 對 AJAX 請求使用 GET 方法 (Use GET for AJAX Requests)
XMLHttpRequest POST 要兩步,而 GET 只需要一步。但要注意的是在 IE 上 GET 最大能處理的 URL 長度是 2K。
幾個不同或者需要補充的地方:
1、“當(dāng)然,Etag 對多數(shù)站點性能的影響并不是很大。”應(yīng)該說 Etag 在正確使用的情況下,會讓大量的請求以 304 頭方式響應(yīng),可以相當(dāng)?shù)墓?jié)省服務(wù)器資源和帶寬。之前一些地方寫的不要使用 Etag,是基于有些 webserver 的 Etag 的計算方法中包含了 inode,這在多臺web服務(wù)器的情況不可采用的,而改變這個計算方法就可以了。
2、對于盡早刷新這點,PHP 幾乎是做不到的。即使你執(zhí)行了 flush 以及類似的函數(shù),也要等到請求完全執(zhí)行之后,才會輸出給瀏覽器端。
3、AJAX 使用 GET 和 POST 各有好處,GET 方式可以更快響應(yīng),但是可能會有被瀏覽器緩存的問題,一般都需要加個隨機數(shù)來避免,POST 方式則不會。所以最好是根據(jù)自己的情況分別使用 GET 和 POST 方法。
- Web 前端優(yōu)化最佳實踐之 Cookie 篇
- 縮小 Cookie (Reduce Cookie Size)
Cookie 是個很有趣的話題。根據(jù) RFC 2109 的描述,每個客戶端最多保持 300 個 Cookie,針對每個域名最多 20 個 Cookie (實際上多數(shù)瀏覽器現(xiàn)在都比這個多,比如 Firefox 是 50 個) ,每個 Cookie 最多 4K,注意這里的 4K 根據(jù)不同的瀏覽器可能不是嚴(yán)格的 4096 。別扯遠(yuǎn)了,對于 Cookie 最重要的就是,盡量控制 Cookie 的大小,不要塞入一些無用的信息。 - 針對 Web 組件使用域名無關(guān)性的 Cookie (Use Cookie-free Domains for Components)
這個話題在此前針對 Web 圖片服務(wù)器 的討論中曾經(jīng)提及。這里說的 Web 組件(Component),多指靜態(tài)文件,比如圖片 CSS 等,Yahoo! 的靜態(tài)文件都在 yimg.com 上,客戶端請求靜態(tài)文件的時候,減少了 Cookie 的反復(fù)傳輸對主域名 (yahoo.com) 的影響。
從這篇 When the Cookie Crumbles 能看出,MySpace 和 eBay 的 Cookie 都不小的,想必是對用戶行為比較關(guān)心。eBay 前不久構(gòu)造了 Personalization Platform ,就是從 Cookie 的限制中跳出來。
- Web 前端優(yōu)化最佳實踐第四部分面向 CSS 篇
Web 前端優(yōu)化最佳實踐第四部分面向 CSS。目前共計有 6 條實踐規(guī)則。另請參見 Mozilla 開發(fā)者中心的文章:Writing Efficient CSS
- 把 CSS 放到代碼頁上端 (Put Stylesheets at the Top)
官方的解釋我覺得多少有點語焉不詳。這一條其實和用戶訪問期望 有關(guān)。CSS 放到最頂部,瀏覽器能夠有針對性的對 HTML 頁面從頂?shù)较逻M(jìn)行解析和渲染。沒有人喜歡等待,而瀏覽器已經(jīng)考慮到了這一點。 - 避免 CSS 表達(dá)式 (Avoid CSS s)
個人認(rèn)為通過 CSS 表達(dá)式能做到的事情,通過其它手段也同樣能做到而且風(fēng)險更小一些。 - 從頁面中剝離 JavaScript 與 CSS (Make JavaScript and CSS External)
剝離后,能夠有針對性的對其進(jìn)行單獨的處理策略,比如壓縮合并及緩存策略。 - 精簡 JavaScript 與 CSS (Minify JavaScript and CSS )
如果沒有 JavaScript 與 CSS 可能更好。但,這是不可能的,SO,盡量小點吧。語法能簡寫的簡寫。 - 使用 在 IE 中 @import 指令等同于把 link 標(biāo)記寫在 HTML 的底部。而這與第一條相違背。
- 避免使用Filter (Avoid Filters)
- Web 前端優(yōu)化最佳實踐之 JavaScript 篇
- 腳本放到 HTML 代碼頁底部 (Put Scripts at the Bottom)
當(dāng)一個腳本在下載的時候,瀏覽器干不了其它的事兒(串行了)。所以,把它扔到最后面去處理。對于一些功能性的腳本,可能實現(xiàn)起來有些兩難。不過對于國內(nèi)網(wǎng)站來說,有很多使用 Google Analytics 服務(wù)進(jìn)行網(wǎng)站數(shù)據(jù)分析的。這這一點來說,絕對可行的建議,放到頁面最底下。 - Make JavaScript and CSS External
參見 CSS 篇 的描述 - 精簡 JavaScript 與 CSS (Minify JavaScript and CSS )
參見 CSS 篇 的描述 - 移除重復(fù)腳本 (Remove Duplicate Scripts)
對于一些歷史遺留站點或是論壇類的網(wǎng)站來說,這倒是比較常見的。接手維護(hù)人前后變化過多,每個人都有自己的一套。這就會帶來一些潛在的麻煩。 - 減少 DOM 訪問 (Minimize DOM Access)
有三條指導(dǎo)建議:
* 緩存已經(jīng)訪問過的元素 (Cache references to accessed elements)
* “離線”更新節(jié)點, 再將它們添加到樹中 (Update nodes “offline” and then add them to the tree)
* 避免使用 JavaScript 輸出頁面布局–應(yīng)該是 CSS 的事兒 (Avoid fixing layout with JavaScript) - Develop Smart Event Handlers
除了英文解釋外,這里也提醒一下注意關(guān)于 Java Script 內(nèi)存泄漏 的問題。
- Web 前端優(yōu)化最佳實踐之圖片篇
Web 前端優(yōu)化最佳實踐第六部分面向 圖片(Image),這部分目前有 4 條規(guī)則。在最近的 Velocity 2008 技術(shù)大會上,Yahoo! 的 Stoyan Stefanov 做的Image Optimization: How Many of These 7 Mistakes Are You Making也非常有參考價值。結(jié)合一起說一下。
- 優(yōu)化圖片 (Optimize Images)
使用 GIF 、JPG 還是 PNG 格式的圖片? 盡可能的使用 PNG 格式的圖片,更多的功能,更小的尺寸(與 GIF 相比)。
對于 PNG 圖片,考慮用 Pngcrush 或類似的工具進(jìn)行優(yōu)化。常見的工具如下表:
* pngcrush http://pmt.sourceforge.net/pngcrush/
* pngrewrite http://www.pobox.com/~jason1/pngrewrite/
* OptiPNG http://www.cs.toronto.edu/~cosmin/pngtech/optipng/ (refer: 教程 )
* PNGOut http://advsys.net/ken/utils.htm
另請參見:Five Tips For the Effective Use of PNG Images
對 JPEG 圖片的優(yōu)化工具:
* jpegtran (http://jpegclub.org/)
必需要強調(diào)的是,圖片設(shè)計的同學(xué)啊,請考慮設(shè)計面向 Web 的圖片 ,不要動不動就設(shè)計超過可接受尺寸之外大家伙,這應(yīng)該是一種習(xí)慣,而不是什么高超的技能,只需要記住就成了。
- 使用 CSS Sprites 技巧對圖片優(yōu)化 (Optimize CSS Sprites)
之前提到過,簡單的說就是”利用 CSS background 相關(guān)元素進(jìn)行背景圖絕對定位”,把多次 HTTP 調(diào)用變?yōu)橐淮握{(diào)用,更多參考:CSS Sprites: Image Slicing’s Kiss of Death
補充一下:對于這個技巧我曾經(jīng)見到有人濫用的。把多個背景圖片揉成一個,減少 HTTP 調(diào)用,這是一個很好的思路。但一定要記住這個大圖片不能太”重”,我看到過 100 多K 的背景圖。一個圖片就把整個網(wǎng)站拖得很慢。比較好的例子可以參考雅虎關(guān)系的這個圖 .
更新:使用 CSS Sprites 的一個潛在的副作用是客戶端將消耗更多內(nèi)存(參考)。
- 不要在 HTML 中使用縮放圖片 (Don’t Scale Images in HTML )
更多的時候,可能是因為偷懶而沒有制作合適大小的圖片,如果是批量處理圖片的話,可能一條 ImageMagic 命令(convert )就能搞定 。必須提及的是,看到太多的對圖片拉伸很難看的頁面,救救這些頁面! - 用更小的并且可緩存的 favicon.ico (Make favicon.ico Small and Cacheable)
更小,可緩存,這兩條可能都不是問題。問題是,太多站點根本沒有 favicon.ico 。有的時候,判斷獨立域名的 Blog 是否專業(yè),基本看一下是否有 favicon.ico 就差不多了。
補充:
視覺設(shè)計者應(yīng)該盡量考慮控制圖片大小,推薦在 200K 以下。這不是胡說的,參考頁面。。
針對第3點, 我覺得應(yīng)該強調(diào)一下, 免的有些朋友理解成”使用img元素不要使用width和height元素”(因為我差點兒就這么理解)。這是因為img元素如果不指定的width和height的話,似乎會導(dǎo)致頁面frame的reflow,reflow是會影響性能.
所以比較理想的做法是
1. 圖片要事先處理成合適的大小.不要依靠img元素的width和height屬性來放大和縮小圖片
2. 如果圖片的尺寸是固定的, 最好在width和height中寫清楚, 這樣可以避免頁面frame的reflow
- Web 前端優(yōu)化最佳實踐之 Mobile(iPhone) 篇
Web 前端優(yōu)化最佳實踐最后一部分是針對移動應(yīng)用的,其實只是針對 iPhone 的,目前只有兩條規(guī)則。
- 單個數(shù)據(jù)對象小于 25K (Keep Components under 25K)
這個似乎只是針對 iPhone 研究的。建議保持單個 Web 數(shù)據(jù)對象在 25 K 以下。為什么是 25K? Apple 官方信息指出可緩存到內(nèi)存中的 Web 對象最大支持到 10M,但經(jīng)過測試,發(fā)現(xiàn)也就是 25K 左右。
iPhone 在市場上的優(yōu)異表現(xiàn),讓 Web 人員不得不考慮如何針對其進(jìn)行優(yōu)化。相信這部分內(nèi)容也在不斷變化中。
- Pack Components into a Multipart Document
把Web 頁面組件打包成一個多部分組成的文檔。其目的是減少 HTTP 請求。對這部分語焉不詳,等待后續(xù)更新吧。
Yahoo!貢獻(xiàn)的英文原版:
Exceptional Performance : Best Practices for Speeding Up Your Web Site