兩個激進的前端優化手段
提醒:本文最後更新於 2858 天前,文中所描述的資訊可能已發生改變,請謹慎使用。
連續發了幾篇純後端的文章,來點老本行有關的東東。昨天實現了本部落格的ping server之後,按計劃今天應該寫完ping client的。結果中午裝IE9,體驗新版develop toolbar時,無意中發現我的部落格請求數好多,這對一個搞了這麼多年前端的人來說太丟人了,話不多說,馬上來優化。
首先合併css和js,這沒什麼好講的,寫個py指令碼自動合併檔案,再調下yui壓縮就行了。圖片資源就有點無語了,我這不起眼的部落格面板居然用到20個多平均不到1kb的小圖,作者夠懶的。當然這面板不是我寫的哈,看最底部的版權就知道。
既然是玩自己的部落格程式,當然要發揮可以隨意折騰的優勢。除了拼大圖之外,一個可行的方案是把圖片弄成DataURI/MHTML放進css裡,大家很早就開始這樣玩了。前段時間我也寫過一個py指令碼來實現這個功能,因為有風險還沒在專案中採用,正好拿來試試。跑完指令碼後,背景圖片都替換成了下面這樣的:
.comments-list div.alt { background: #e1f4fc url(../img/comments-list-alt-bkg.png) no-repeat left top; padding-top: 40px; border: none; margin-bottom: 25px;} => .comments-list div.alt { background: #e1f4fc url(data:image/png;base64,iVBORw亂七八糟一堆亂碼SuQmCC) no-repeat left top; padding-top: 40px; border: none; margin-bottom: 25px;*background-image:url(mhtml:http://www.imququ.com/static/blogs/css/style.min.css!13);}
原理和具體怎麼實現就不貼了,網上一大堆。需要注意的幾點:1、不要忘記最後一個分隔符後的“--”;2、引用mhtml檔案一定要用絕對路徑;3、要先yui壓縮再編圖片別弄反了,為什麼呢自己想。
搞定資源連線數後,還有一點極其不爽。Ctrl+U看下,原始碼裡大段的換行和tab,非常的不美觀。這問題在模板輸出頁面時很普遍,smarty提供了strip去多餘的空白,django有類似的spaceless。問題是這些標記要自己找合適的位置去新增,strip範圍太大容易出問題,我這麼懶當然不想一個個加。於是,就有了下面的方案。
統一攔截response,對content做html語法分析,去掉不想要的內容,再拼裝起來輸出,這就一勞永逸了。除了空白之外還有一些屬性什麼的也可以去掉,詳情可以看Miller同學這篇(連結已失效),非常全面,而且按推薦與否做了歸類。
得益於django高階的中介軟體思想,這個過程實現出來差不多就下面幾行:
class CompressHtmlMiddleware(object):
def process_response(self, request, response):
if request.GET.get('compress_html', '') == '1': #根據url引數判斷是否開啟壓縮
parser = HtmlParser()
parser.feed(response.content)
response.content = parser.output()
return response
這裡用到的HtmlParser是我之前基於SGMLParser寫的一段程式碼,除了去空白換行,還有幾個額外功能。寫得實在是爛就不獻醜了。貼幾個配置項,大概就明白了:
#可以刪除的閉合標籤
remove_endtag = ["html", "body", "colgroup", "thead", "tr", "tbody", "td", "p", "dt", "dd", "li", "option", "tfoot"]
#可以刪除屬性值的屬性
token_only_name = ['disabled','selected','checked', 'readonly', 'multiple']
#可以刪除的標籤預設屬性(空屬性全部去掉)
token_def_val = {
'link' : { 'media' : 'screen' },
'input' : { 'type' : 'text' },
'form' : { 'method' : 'get' },
'script' : { 'type' : 'text/javascript' }
}
可以看出,li、body、html什麼的結束符都被幹掉了;屬性值只要沒有特殊符號,兩端的引號也不要了。這是一個要速度不要標準的方案。
總結下,DataURI/MHTML的方案,追求最少的連線數,卻導致css檔案變大不少;HTML激進壓縮為了使程式碼內容最少,放棄標準並增加了客戶端解析的難度。自己的部落格怎麼玩都可以,實際專案中值不值得這樣去做,就要具體問題具體分析了。
--EOF--
發表於 2011-03-16 01:12:48 ,並被新增「 效能優化 」標籤 。檢視本文 Markdown 版本 »
提醒:本文最後更新於 2858 天前,文中所描述的資訊可能已發生改變,請謹慎使用。
相關推薦
兩個激進的前端優化手段
提醒:本文最後更新於 2858 天前,文中所描述的資訊可能已發生改變,請謹慎使用。 連續發了幾篇純後端的文章,來點老本行有關的東東。昨天實現了本部落格的ping server之後,按計劃今天應該寫完ping client的。結果中午裝IE9,體驗新版develop toolbar時,無意中發現我的部
iOS TableView優化的兩個方法(優化卡頓)
方法二: 可以利用UIScrollViewDelegate代理很好的解決這問題 - (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)dece
SPFA的兩個優化
splay hid while tar pty += 最短路 9.png empty 評測題:洛谷【模板】單源最短路徑 不加任何優化: 1 queue<int>q; 2 void spfa(ll s) 3 { 4 for(ll i=1
裸辭兩個月,海投一個月,從Android轉戰Web前端的求職之路
既然 走了 感覺 全棧 繼續 最大的 第一次 試題 矛盾 前言 看到這個標題的童鞋,可能會產生兩種想法: 想法一:這篇文章是標題黨 想法二:Android開發越來越不景氣了嗎?前端越來越火了嗎? 我一向不喜歡標題黨,標題中的內容是我的親身經歷。我是2016年6月份畢業,
SQL Server查詢優化中的兩個選項
掃描 etime 日期時間 flag ram 最終 指導 can mitm 本文中,我們將介紹兩個SQL Server中的可用概念,它們是使用SQL Server時值得註意的技術。 1. OPTIMIZE FOR Unknown SQL Server 20
IC數字前端設計開發24 (Linux md5sum比較兩個資料夾下面檔案是否相同)
來自:https://blog.csdn.net/wengyupeng/article/details/69791404 Copy資料夾之後,檢測兩個資料夾(dir1,dir2)下檔案是否相同。logdir 是任何一個存放生成檔案的目錄 . cd dir1
ajax用post請求後臺controller實現前端後臺互動 傳兩個引數 ,後臺controller接收處理
PS→無奈:生氣,就是拿別人的過錯來懲罰自己。原諒別人,就是善待自己。 前臺jsp: $.ajax({ function getPage(page,size) { var postData={ "page":"1",
vue陣列優化的兩種方法track-by和key 這兩個有什麼區別
1. v-bind:key=" " 是vue2.x提出的,1.x的寫法是track-by=" " 2、(1)vue1.x中v-for不能顯示重複資料,要在v-for的元素內定義track-by="$index",即以序號為索引,如此當增加或者刪除資料,view都會跟著改變
面試web前端工程師的兩個星期的心路歷程及面試題分享
博主畢業接近3年半了,年初公司進行了一次業務調整,hr小姐姐明裡暗裡讓我們自動滾蛋,但是我牛脾氣上來了你不說可能我自己會走,你這一說我偏不走了,於是乎,生生熬到9月份。。。 9月中旬開始改簡歷,投遞簡歷。。。小姐姐我並不是大神,簡簡單單的一個小前端,主要做官網型別的開發,主要使用html,cs
從前端和後端兩個角度分析jsonp跨域訪問(完整例項)
一、什麼是跨域訪問 舉個栗子:在A網站中,我們希望使用Ajax來獲得B網站中的特定內容。如果A網站與B網站不在同一個域中,那麼就出現了跨域訪問問題。你可以理解為兩個域名之間不能跨過域名來發送請求或者請求資料,否則就是不安全的。跨域訪問違反了同源策略,同源策略的詳
前端演算法:給定兩個陣列,編寫一個函式來計算它們的交集(兩個陣列的交叉點)
給定兩個陣列,編寫一個函式來計算它們的交集。 例1: 輸入: nums1 = [1,2,2,1],nums2 = [2,2] 輸出:[2,2] 例2: 輸入: nums1 = [4,9,5],nums2 = [9,4,9,8,4] 輸出:[4,9] 注意: 結果
web前端——ajax提交後臺controller實現前端後臺互動(2) 傳兩個引數 ,後臺controller接收處理
前臺jsp: $.ajax({ function getPage(page,size) { var postData={ "page":"1", "keywordId":"26"
《一個階段的結束是另一個階段的開始--記這兩個月以來的前端實習生面試》
首先宣告一下哈,本人也是菜鳥一個,以下闡述的各種觀點均是個人看法哈,只為拋磚引玉,歡迎各路大神評論給出建議。 這篇文章的github地址 零、前言: 3、4月是相當忙碌的兩個月,這兩個月就是每天學習,每天看書,以及各種面試。到現在,自己的實習生面試也已
兩個超大表做關聯更新的優化 之 批量更新
今天同事給了兩個SQL,超級大,一個表8000多萬,一個表7800萬,原語句如下: [@[email protected]] update CHANNEL_CHENGDU.o_user_CONS partition(p201011) A SET unuser_flag = (SELECT unus
執行緒間無需特別的手段進行通訊,因為執行緒間可以共享資料結構,也就是一個全域性變數可以被兩個執行緒同時使用,不過要注意的是執行緒間需要做好同步。
執行緒間無需特別的手段進行通訊,因為執行緒間可以共享資料結構,也就是一個全域性變數可以被兩個執行緒同時使用。不過要注意的是執行緒間需要做好同步,一般用mutex。可以參考一些比較新的UNIX/Linux程式設計的書,都會提到Posix執行緒程式設計,比如《UNIX
Web前端二級選單的兩個關鍵問題
最近在學前端,發現前端真心比後端頭大!總是出現這邊問題解決了,結果另一個問題出來了。今天終於摸索出來了關於寫二級選單的兩個關鍵點,本文將記錄下來,提供參考! 問題一: 二級選單中,二級選單容器擠擴父容器。 原因: 父容器沒有固定高度。 解決: 給父
前端優化,需要考慮的幾個方面
最近在研究前端優化,在看了雅虎前端優化34條規則後,將最重要的幾條加上自己的理解整理如下: 同域名限制。瀏覽器對同域名的併發請求數有限制,不同瀏覽器略有不同,但一般都在4-6之間。chrome一個
前端知乎:關於阮一峰部落格《學習Javascript閉包》章節中最後兩個思考題
阮一峰部落格:《學習Javascript閉包》章節中最後有個思考題: 如果你能理解下面兩段程式碼的執行結果,應該就算理解閉包的執行機制了。 程式碼片段一 var name = "The Window"; var object = { name: "My Obj
前端優化:9 個技巧,提高 Web 效能
1. 清理 HTML 文件 HTML,即超文字標記語言,幾乎是所有網站的支柱。HTML 為網頁帶來標題、子標題、列表和其它一些文件結構的格式。在最近更新的 HTML5 中,甚至可以建立圖表。 HTML 很容易被網路爬蟲識別,因此搜尋引擎可以根據網站的內容在一定程度上實時更
IC數字前端設計開發18 (用shell指令碼編寫區別兩個資料夾內檔案的不同)
#!/bin/bash mkdir tmp basedir="./tmp" workdir="./" #這是定義兩個目錄,按照你的說法,這兩個目錄下檔名應該都是相同的 dir1="txt_test0" dir2="txt_test1" #這是用來儲存查詢di