Steve Souders 這個傢伙寫了一本書叫做:High Performance Web Sites: Essential Knowledge for Front-End Engineers
這本書裡定義了14條讓你的網頁加速的方法,分別如下:
- Make fewer HTTP requests
- Use a CDN
- Add an Expires header
- Gzip components
- Put CSS at the top
- Move JS to the bottom
- Avoid CSS expressions
- Make JS and CSS external
- Reduce DNS lookups
- Minify JS
- Avoid redirects
- Remove duplicate scripts
- Turn off ETags
- Make AJAX cacheable and small
而以下是我研究後的心得分享:
1. Make fewer HTTP requests
- 減少 Image 的 Request 次數
- 使用 CSS Sprites 技巧
http://alistapart.com/articles/sprites
- 使用 Image Map 技巧
- 使用 Inline Image 技巧 ( data: )
http://tools.ietf.org/html/rfc2397
P.S. 可以開發一個 Inline Image 產生器!
P.S. 建議將 Inline Image 快取在 CSS 檔案中,這樣可避免 HTML 太大
- 減少 CSS / JavaScript 的 Request 次數
- 整合多個分開的 CSS / JavaScript
2. Use a CDN
- N/A
3. Add an Expires header
- 加入 Expires Header 到 Image, CSS, JavaScript 檔案裡
4. Gzip components
- 壓縮 HTML, JavaScript, StyleSheet, XML, JSON,但切記「不要壓縮 Images, PDF 檔案」!
- 設定方法
Apache 2.x: 使用 mod_deflate
AddOutputFilterByType DEFLATE text/html text/css application/x-javascript
IIS 6.0
Enabling HTTP Compression (IIS 6.0)
http://www.microsoft.com/technet/prodtechnol/WindowsServer2003/Library/IIS/502ef631-3695-4616-b268-cbe7cf1351ce.mspx?mfr=true
Using HTTP Compression for Faster Downloads (IIS 6.0)
http://www.microsoft.com/technet/prodtechnol/WindowsServer2003/Library/IIS/25d2170b-09c0-45fd-8da4-898cf9a7d568.mspx?mfr=true
Enabling HTTP Compression in IIS 6.0
http://dotnetjunkies.com/Article/16267D49-4C6E-4063-AB12-853761D31E66.dcik
IIS Compression in IIS6.0
http://weblogs.asp.net/owscott/archive/2004/01/12/57916.aspx
IIS 5.0
HOW TO: 啟用 IIS 中的 ASPX 壓縮
http://support.microsoft.com/kb/322603
- HTTP Header Style
HTTP request
Accept-Encoding: gzip, deflate
HTTP response
Content-Encoding: gzip
Vary: Accept-Encoding ( 這行是給 Proxy Server 看的 )
- 其他注意事項
- 個人化的頁面要加上 ==> Cache-Control: Private
- 移除 ETags (Rule 13)
5. Put CSS at the top
- 一定要將 CSS 放在 <head> 區段載入!
- 使用 <LINK> 標籤,不要使用 @import 語法
- Avoid Flash of Unstyled Content (FOUC) in IE
http://www.bluerobot.com/web/css/fouc.asp/
<!-- Hack to avoid flash of unstyled content in IE -->
<script type="text/javascript"> </script>
6. Move JS to the bottom
- 一定要將所有 JavaScript 都擺在頁面最下方
</body> 之前
因為所有在 JavaScript Include 以下的 HTML 在 JS 還沒讀完前,都不會顯示畫面
- 把 JavaScript 的 Code 都放在 onload 執行!!
7. Avoid CSS expressions
- 不要使用 CSS expressions 因為可能這段 expression 會在每一次 mouse move, resize, scroll, key press 時執行!
- 要使用 EventHandler 去執行這些 Expression (JS Code)
8. Make JS and CSS external
- 反正 JS 跟 CSS 拉到外面成獨立檔案就是好的,但「首頁」可以例外!
- 使用 Post-onload download 技巧
download external files after onload
window.onload = downloadComponents;
function downloadComponents() {
var elem = document.createElement("script");
elem.src = "http://.../file1.js";
document.body.appendChild(elem);
...
}
範例:http://stevesouders.com/hpws/dynamic-inlining.php
作法:
1. 在 Server-side 判斷使用者 Browser 有設定 Cookie["hasPostOnloadDownload"]
1.1. 若沒有,就使用 post-onload download 動態下載 CSS & JS
1.2. 若有用,就直接用 <script src="xxxx.js"></script> 下載,Browser 會抓取 Cache 的版本
P.S. cookie expiration date is key
9. Reduce DNS lookups
- 在一個頁面中,不要超過 2 - 4 個 Hostname,不然會降低頁面載入速度
- 開啟 Keep-Alive 支援
10. Minify JS
- jsmin
http://crockford.com/javascript/jsmin
下載後更名成 jsmin.zip 解壓縮出 jsmin.exe 即可執行
jsmin.exe < input.js > output.js (注意:所有 UTF-8 編碼的 js 檔會變成 ANSI as UTF-8 編碼)
- dojo compressor
http://dojotoolkit.org/docs/shrinksafe
11. Avoid redirects
- 參考資料:http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html
- 避免 Redirect 產生的方式
* 網址若省略檔名時,最後面一定要加上 / 結尾
* 追查 Log 檔
- 查看 Log Referer
12. Remove duplicate scripts
- 這一點雖然很呆,不過連 MSN Space, Yahoo 都有類似的情況!
- 在 ASP.NET 的元件中(UserControls, WebControls),請多使用 Page.ClientScript.RegisterScriptInclude 的方式!
13. Turn off ETags
- 基本格式
* unique identifier returned in response
ETag: "c8897e-aee-4165acf0"
Last-Modified: Thu, 07 Oct 2004 20:54:08 GMT
* used in conditional GET requests
If-None-Match: "c8897e-aee-4165acf0"
If-Modified-Since: Thu, 07 Oct 2004 20:54:08 GMT
- if ETag doesn't match, can't send 304
- ETag format
Apache:
ETag: inode-size-timestamp
IIS:
ETag: Filetimestamp:ChangeNumber
- IIS 設定方式
自動設定方式
ETagFix - keep IIS eTags from changing
http://www.snapfiles.com/get/etagfix.html
原創公司:ISAPILab http://www.isapilabs.com/
安裝 http://www.isapilabs.com/downloads/ETagFix-setup.exe 之後會重新啟動 IIS 之後就沒問題了!
Related: http://www.snapfiles.com/Freeware/server/fwiis.html
Note:
在 IIS 5.0 可以正常運作
在 IIS 6.0 必須要執行在 Isolate Mode 才可以使用 ISAPI,預設是不能用的!
手動設定方式
* 如果不是用 Windows Server 2003 SP1 要先安裝 Hotfix 900245
http://support.microsoft.com/kb/900245/
* 先安裝 IIS 6.0 Resource Kit
http://www.microsoft.com/downloads/details.aspx?FamilyId=56FC92EE-A71A-4C73-B628-ADE629C89499&displaylang=en
* 使用 Metabase Explorer 開啟 LM \ W3SVC 新增 DWORD to 2039 其 Value="0" ( 每一台 WebFarm 底下的電腦都要這樣設定 )
* 重新啟動 IIS
net stop iisadmin /y
net start w3svc
net start smtpsvc
參考資料
* 您可能會當您使用 Internet Explorer 6, 試著存取 Web 應用程式所裝載在 Internet Information Services 6.0 Web 效能非常低
http://support.microsoft.com/kb/922703/
- Apache 設定方式
FileETag none
14. Make AJAX cacheable and small
- XHR, JSON, iframe, dynamic scripts 都一樣可以被快取(Cached)、最小化(minified)和壓縮(gzipped)
- 個人化的頁面回應時,一樣要做快取,但是針對「該使用者」做快取(Cache-Control: private)
- 在使用 XHR 時,URL 可以加上「最近的修改時間」在 QueryString 裡。
GET /yab/[...]&r=0.5289571053069156 HTTP/1.1
- 回傳資料時的 Header 可以用 Cache-Control: private + Last-Modified,使用者就不會一直連到網站抓網站了!!
設定 Cache Header 注意事項
* 個人化的頁面一定要設定
Response.Cache.SetCacheability(HttpCacheability.Private);
* 如果要 Cache 頁面或 External Reference 檔案(CSS/JS)一定要加上
Response.Cache.SetLastModified(DateTime.Now);
如果不加上 MaxAge 的話,將會無限時間的 Cache 直到下次 Reload 或開新 Browser 手動輸入網址進入網頁
* 如果要指定 Cache 的時間要加上
Response.Cache.SetMaxAge(new TimeSpan(0, 0, 0, 10));
Response.Cache.SetExpires(DateTime.Now.AddSeconds(10));
* 如果不要頁面被 Cache 的話
Response.Cache.SetMaxAge(TimeSpan.Zero);
Response.Cache.SetExpires(DateTime.MinValue);