高性能WEB開發(fā)之瘋狂的HTML壓縮
上一篇隨筆中網(wǎng)友 skyaspnet 問我如何壓縮HTML,當(dāng)時回答是推薦他使用gzip,后來想想,要是能把所有的html,jsp(aspx)在運行前都壓縮成1行未免不是一件好事啊。一般我們啟動gzip都比較少對html啟動gzip,因為現(xiàn)在的html都是動態(tài)的,不會使用瀏覽器緩存,而啟用gzip的話每次請求都需要壓縮,會比較消耗服務(wù)器資源,對js,css啟動gzip比較好是因為js,css都會使用緩存。我個人覺得的壓縮html的最大好處就是一本萬利,只要寫好了一次,以后所有程序都可以使用,不會增加任何額外的開發(fā)工作。
在“JS、CSS的合并、壓縮、緩存管理”一文中說到自己寫過的1個自動合并、壓縮JS,CSS,并添加版本號的組件。這次把壓縮html的功能也加入到該組件中,流程很簡單,就是在程序啟動(contextInitialized or Application_Start)的時候掃描所有html,jsp(aspx)進(jìn)行壓縮。
壓縮的注意事項:
實現(xiàn)的方式主要是用正則表達(dá)式去查找,替換。在html壓縮的時候,主要要注意下面幾點:
1. pre,textarea 標(biāo)簽里面的內(nèi)容格式需要保留,不能壓縮。
2. 去掉html注釋的時候,有些注釋是不能去掉的,比如:<!--[if IE 6]> ..... <![endif]-->
3. 壓縮嵌入式j(luò)s中的注釋要注意,因為可能注釋符號會出現(xiàn)在字符串中,比如: var url = "http://www.cnblogs.com"; // 前面的//不是注釋
去掉JS換行符的時候,不能直接跟一下行動內(nèi)容,需要有空格,考慮下面的代碼:
- else
- return;
如果不帶空格,則變成elsereturn。
4. jsp(aspx) 中很有可能會使用嵌入一些服務(wù)器代碼,這個時候也需要單獨處理,里面注釋的處理方法跟js的一樣。
源代碼:
下面是java實現(xiàn)的源代碼,也可以 猛擊此處 下載該代碼,相信大家都看的懂,也很容易改成net代碼:
- show source
使用注意事項:
使用了上面方法后,再運行程序,是不是發(fā)現(xiàn)每個頁面查看源代碼的時候都變成1行啦,還不錯吧,但是在使用的時候還是要注意一些問題:
1. 嵌入js本來想調(diào)用yuicompressor來壓縮,yuicompressor壓縮JS前,會先編譯js是否合法,因我們嵌入的js中可能很多會用到一些服務(wù)器端代碼,比如 var now = ,這樣的代碼會編譯不通過,所以無法使用yuicompressor。
最后只能自己寫壓縮JS代碼,自己寫的比較粗燥,所以有個問題還解決,就是如果開發(fā)人員在一句js代碼后面沒有加分號的話,壓縮成1行就很有可能出問題。所以使用這個需要保證每條語句結(jié)束后都必須帶分號。
2. 因為是在程序啟動的時候壓縮所有jsp(aspx),所以如果是用戶請求的時候動態(tài)產(chǎn)生的html就無法壓縮。
原文鏈接:http://www.cnblogs.com/BearsTaR/archive/2010/05/17/html_compressor.html
【編輯推薦】