前端性能優(yōu)化的14個(gè)規(guī)則
作為一個(gè)半前端工程師,而且只會(huì)寫(xiě)點(diǎn)HTML5和CSS3的“假”前端工程師,為了能更好地理解一下前端的花花世界,最近拜讀了《高性能網(wǎng)站建設(shè)指南》一書(shū),對(duì)作者提出的前端性能優(yōu)化的14個(gè)規(guī)則獲益匪淺,為了讓自己印象更深刻點(diǎn),決定作此文,當(dāng)做學(xué)習(xí)筆記也好,知識(shí)總結(jié)也罷,總歸看過(guò)的東西要讓自己很好地掌握很好地運(yùn)用起來(lái)才是王道。在解讀這些規(guī)則的同時(shí),我會(huì)用我一年半多的移動(dòng)網(wǎng)站開(kāi)發(fā)經(jīng)歷提出一些針對(duì)移動(dòng)網(wǎng)站的優(yōu)化建議。
更多的電子書(shū):瀏覽所有電子書(shū)資源
規(guī)則01:盡量減少HTTP請(qǐng)求
前端優(yōu)化的黃金準(zhǔn)則指導(dǎo)著前端頁(yè)面的優(yōu)化策略:只有10%-20%的最終用戶響應(yīng)時(shí)間花在接受請(qǐng)求的HTML文檔上,剩下的80%-90%時(shí)間花在為HTML文檔所引用的所有組件(圖片、腳本、樣式表等)進(jìn)行的HTTP請(qǐng)求上。因此,改善響應(yīng)時(shí)間的最簡(jiǎn)單途徑就是減少組件的數(shù)量,并由此減少HTTP請(qǐng)求的數(shù)量。當(dāng)然很多人就會(huì)說(shuō),既然這樣,那我們就減少頁(yè)面組件的數(shù)量不就OK了嗎?那你試試,你會(huì)掀起一場(chǎng)性能優(yōu)化和產(chǎn)品設(shè)計(jì)之間的大PK。
所以,我們要減少HTTP請(qǐng)求是要平衡性能和設(shè)計(jì)的。如果找到這個(gè)平衡點(diǎn)呢?書(shū)中從以下幾個(gè)方面做了介紹,我逐一說(shuō)明:
① 圖片地圖
初看“圖片地圖”四個(gè)字,對(duì)非專業(yè)的前端人員來(lái)說(shuō)一頭霧水,我的第一印象就是這樣的,咱們以京東的移動(dòng)站點(diǎn)為例,右側(cè)用戶和購(gòu)物車的圖標(biāo),正常實(shí)現(xiàn)我會(huì)選擇如下方式:
<div class=”定義用戶icon顯示的樣式表”></div>
</a>
<a href=”購(gòu)物車跳轉(zhuǎn)頁(yè)面URL”>
<div class=” 定義用戶icon顯示的樣式表”></div>
</a>
這種方式無(wú)可厚非的,但是兩張圖片就有兩個(gè)HTTP請(qǐng)求,這明顯是增加了頁(yè)面中的HTTP請(qǐng)求。那么我們可以把這兩個(gè)HTTP請(qǐng)求變成一個(gè)嗎?
答案當(dāng)然是可以的,這就是圖片地圖:允許在一張圖片上關(guān)聯(lián)多個(gè)URL,而目標(biāo)URL的選擇取決于用戶單擊了圖片上的哪個(gè)位置。
這樣上面京東兩個(gè)圖標(biāo)合并成一張圖片,這樣圖片的HTTP請(qǐng)求就減少了一個(gè)。
示例代碼如下:
<map name=”map1”>
<areashape=”rect” coords=”0,0,40,40” href=”用戶跳轉(zhuǎn)頁(yè)面URL”>
<areashape=”rect” coords=”50,0,90,40” href=”購(gòu)物車跳轉(zhuǎn)頁(yè)面URL”>
</map>
不過(guò)圖片地圖只支持矩形形狀,其他形狀不支持。
② 請(qǐng)CSS喝“雪碧”(CSS Sprites)CSS Sprites一句話:將多個(gè)圖片合并到一張單獨(dú)的圖片,這樣就大大減少了頁(yè)面中圖片的HTTP請(qǐng)求。
③ 內(nèi)聯(lián)圖片和腳本使用data:URL(Base64編碼)模式直接將圖片包含在Web頁(yè)面中而無(wú)需進(jìn)行HTTP請(qǐng)求。但是此種方法存在明顯缺陷:- 不受IE的歡迎;- 圖片太大不宜采用這種方式,因?yàn)锽ase64編碼之后會(huì)增加圖片大小,這樣頁(yè)面整體的下載量會(huì)變大;- 內(nèi)聯(lián)圖片在頁(yè)面跳轉(zhuǎn)的時(shí)候不會(huì)被緩存。(大圖片可以使用瀏覽器的本地緩存,在首次訪問(wèn)的時(shí)候保存到瀏覽器緩存中,典型的是HTML5的manifest緩存機(jī)制以及LocalStorage等)。
④ 樣式表的合并將頁(yè)面樣式定義、腳本、頁(yè)面本身代碼嚴(yán)格區(qū)分開(kāi),但是樣式表、腳本也不是分割越細(xì)越好,因?yàn)闆](méi)多引用一個(gè)樣式表就增加一次HTPP請(qǐng)求,能合并的樣式表盡量合并。一個(gè)網(wǎng)站有一個(gè)公用樣式表定義,每個(gè)頁(yè)面只要有一個(gè)樣式表就OK啦。
通過(guò)以上四個(gè)努力之后,你會(huì)發(fā)現(xiàn)你的網(wǎng)頁(yè)響應(yīng)時(shí)間最多能減少一半,這不是作者說(shuō)大話,也不是我狂吹,我親手用我的移動(dòng)網(wǎng)站首頁(yè)做了一個(gè)嘗試,本地測(cè)試之后響應(yīng)時(shí)間能減少40%左右。所以減少頁(yè)面HTTP請(qǐng)求數(shù)量,是一個(gè)很重要的原則。遵循此原則可以同時(shí)改善首次訪問(wèn)和后續(xù)訪問(wèn)的響應(yīng)時(shí)間,而每一個(gè)網(wǎng)站的首次響應(yīng)時(shí)間會(huì)決定用戶之后還來(lái)不來(lái)的重要原因。
規(guī)則02:使用內(nèi)容發(fā)布網(wǎng)絡(luò)(CDN的使用)
什么叫內(nèi)容發(fā)布網(wǎng)絡(luò)(CDN)?它是一組分布在多個(gè)不同地理位置的Web服務(wù)器,用于更加有效地向用戶發(fā)布內(nèi)容。主要用于發(fā)布頁(yè)面靜態(tài)資源:圖片、css文件、js文件等。如此,能輕易地提高響應(yīng)速度。關(guān)于CDN的具體詳細(xì)原理以及優(yōu)缺點(diǎn),各位可以自行詢問(wèn)度娘或者google。
規(guī)則03:添加Expires頭
瀏覽器使用緩存來(lái)減少HTTP請(qǐng)求的數(shù)據(jù),并減小HTTP響應(yīng)的大小,使頁(yè)面加載更快。Web服務(wù)器使用Expires頭來(lái)告訴瀏覽器它可以使用一個(gè)組件的當(dāng)前副本,直到指定的deadline為止。HTTP規(guī)范中稱此頭為:在這一時(shí)間之后響應(yīng)被認(rèn)為失效。個(gè)人對(duì)這塊表示不想使用,其實(shí)就是一句話,把一些css、js、圖片在首次訪問(wèn)的時(shí)候全部緩存到瀏覽器本地,從我做移動(dòng)網(wǎng)站的過(guò)程中發(fā)現(xiàn),其實(shí)沒(méi)有這么復(fù)雜,完全可以使用HTML5提供的本地緩存機(jī)制就OK了。關(guān)于HTML5本地緩存機(jī)制,各位可以查閱相關(guān)資料。后續(xù)我也會(huì)對(duì)HTML5的緩存機(jī)制進(jìn)行介紹的。
規(guī)則04:壓縮組件(使用Gzip方式)
書(shū)中關(guān)于壓縮從gzip壓縮方式到如何壓縮講了很多,我想直接跳過(guò),對(duì)于做PC網(wǎng)站或者移動(dòng)網(wǎng)站來(lái)說(shuō),急需要壓縮的是css文件和js文件,至于如何壓縮,網(wǎng)上有很多在線工具,去挑選一個(gè)自己用的順手看的順眼的就好,當(dāng)然也有人選擇對(duì)HTML進(jìn)行壓縮,這樣也可以。但是實(shí)際工作中我沒(méi)有這么做。之所謂沒(méi)有這么做,是因?yàn)槲矣X(jué)得很麻煩。不要鄙視我,畢竟我不是一個(gè)真正意義上的前端工程師,哈哈!
規(guī)則05:將CSS樣式表放在頂部
如果將css樣式定義放在頁(yè)面中或者頁(yè)面底部,會(huì)出現(xiàn)短暫白屏或者某一區(qū)域短暫白板的情況,這和瀏覽器的運(yùn)營(yíng)機(jī)制有關(guān)的,不管頁(yè)面如何加載,頁(yè)面都是逐步呈現(xiàn)的。所以在每做一個(gè)頁(yè)面的時(shí)候,用Link標(biāo)簽把每一個(gè)樣式表定義放在head中。
規(guī)則06:將javascript腳本放在底部
瀏覽器在加載css文件時(shí),頁(yè)面逐步呈現(xiàn)會(huì)被阻止,直到所有css文件加載完畢,所以要把css文件的引用放到head中去,這樣在加載css文件時(shí)不會(huì)組織頁(yè)面的呈現(xiàn)。但是對(duì)于js文件,在使用的時(shí)候,它下面所有也頁(yè)面內(nèi)容的呈現(xiàn)都會(huì)被阻塞,將腳本放在頁(yè)面越靠下的地方,就意味著越多的內(nèi)容能夠逐步呈現(xiàn)。
規(guī)則07:避免使用CSS表達(dá)式
CSS表達(dá)式是動(dòng)態(tài)玩CSS的一種很強(qiáng)大的方式,但是強(qiáng)大的同時(shí)也存在很高的危險(xiǎn)性。因?yàn)閏ss表達(dá)式的頻繁求值會(huì)導(dǎo)致css表達(dá)式性能低下。如果真想玩css表達(dá)式,可以選用只求值一次的表達(dá)式或者使用事件處理來(lái)改變css的值。
規(guī)則08:使用外部javascript和CSS內(nèi)聯(lián)js和css其實(shí)比外部文件有更快的響應(yīng)速度,那為什么還要用外部呢?因?yàn)槭褂猛獠康膉s和css可以讓瀏覽器緩存他們,這樣不僅HTML文檔大小減少,而且不會(huì)增加HTTP請(qǐng)求數(shù)量。另外,使用外部js和css可以提高組件的可復(fù)用性。
規(guī)則09:減少DNS查詢
DNS查詢有時(shí)間開(kāi)銷,通常一個(gè)瀏覽器查找一個(gè)給定主機(jī)名的IP地址需要20-120ms。緩存DNS:緩存DNS查詢可以很好地提高網(wǎng)頁(yè)性能,一旦緩存了DNS查詢,之后對(duì)于相同主機(jī)名的請(qǐng)求就無(wú)需進(jìn)行再次的DNS查找,至少短時(shí)間內(nèi)不需要。所以在使用頁(yè)面中URL、圖片、js文件、css文件等時(shí),不要使用過(guò)多不同的主機(jī)名。
規(guī)則10:精簡(jiǎn)javascript
如何精簡(jiǎn)?
最初始的精簡(jiǎn)方式:就是移除不必要的字符減小js文件大小,改善加載時(shí)間。包括所有的注釋、不必要的空白字符。
高級(jí)一點(diǎn)的精簡(jiǎn)方式就是:混淆。
它不但會(huì)移除不必要的字符,還會(huì)改寫(xiě)代碼,比如函數(shù)和變量的名字會(huì)被改成很短的字符串,這樣使js代碼更簡(jiǎn)練更難閱讀。
但是我一般很少使用混淆,一個(gè)現(xiàn)在互聯(lián)網(wǎng)時(shí)代,代碼沒(méi)有必要整的那么神秘,大可以大家一起share,天下代碼一起抄,只要抄出自己的特色就ok了。
而且一旦使用混淆,對(duì)于js代碼的維護(hù)和調(diào)試都很復(fù)雜,因?yàn)橛袝r(shí)候混淆之后的js代碼完全看不懂。其實(shí)實(shí)際開(kāi)發(fā)過(guò)程中,從文件大小和代碼可復(fù)用性來(lái)說(shuō),不僅僅是js代碼需要精簡(jiǎn),css代碼一樣也很需要精簡(jiǎn)。
規(guī)則11:避免重定向
重定向的英文是Redirect,用于將用戶從一個(gè)URL重新跳轉(zhuǎn)到另一個(gè)URL。
最常見(jiàn)的Redirect就是301和302兩種。
關(guān)于重定向的性能影響這里就不說(shuō)了,自行查閱相關(guān)資料吧。
在我們實(shí)際開(kāi)發(fā)中避免重定向最簡(jiǎn)單也最容易被忽視的一個(gè)問(wèn)題就是,設(shè)置URL的時(shí)候,最后的“/”,有些人有時(shí)候會(huì)忽略,其實(shí)你少了“/”,這時(shí)候的URL就被重定向了,所以在給頁(yè)面鏈接加URL的時(shí)候切記最后的“/”不可丟。
規(guī)則12:刪除重復(fù)腳本
重復(fù)的js代碼除了有不必要的HTTP請(qǐng)求之外,還會(huì)浪費(fèi)執(zhí)行js的時(shí)間。
將你使用的js代碼模塊化,可以很好地避免這個(gè)問(wèn)題,至于js模塊化如何實(shí)現(xiàn),現(xiàn)在有很多可以使用的開(kāi)源框架,我用的比較多的是我們公司玉伯的Sea.js。
規(guī)則13:配置ETag
Etag(Entity Tag),實(shí)體標(biāo)簽,是Web服務(wù)器和瀏覽器用戶確認(rèn)緩存組件的有效性的一種機(jī)制。寫(xiě)的很復(fù)雜,對(duì)我這種非專業(yè)的前端開(kāi)發(fā)人員來(lái)說(shuō),有點(diǎn)過(guò)了,關(guān)于這個(gè)原則有興趣的自己看吧。
規(guī)則14:使Ajax可緩存
針對(duì)頁(yè)面中主動(dòng)的Ajax請(qǐng)求返回的數(shù)據(jù)要緩存到本地,當(dāng)然這個(gè)是針對(duì)短期內(nèi)不會(huì)變化的數(shù)據(jù)。如果不確定數(shù)據(jù)變化周期的話,可以增加一個(gè)修改標(biāo)識(shí)的判斷,我正常處理過(guò)程中會(huì)給一些Ajax請(qǐng)求返回的數(shù)據(jù)增加一個(gè)MD5值的判斷,每次請(qǐng)求會(huì)判斷當(dāng)前MD5是否變化,如果變化了取最新的數(shù)據(jù),如果不變化,則不變。
噼里啪啦說(shuō)了一堆,14個(gè)規(guī)則啊,那我們開(kāi)發(fā)過(guò)程中要針對(duì)這每一個(gè)規(guī)則對(duì)自己的前端代碼做check嗎?我反正不這么干,做前端頁(yè)面,尤其是移動(dòng)網(wǎng)站的頁(yè)面,我所記住的準(zhǔn)則就是:盡量減少頁(yè)面大小,盡量降低頁(yè)面響應(yīng)時(shí)間。在頁(yè)面性能和交互設(shè)計(jì)之中找平衡點(diǎn)。
本文地址:http://likemindfilms.com/tutorial/wd1805.html
您可能還喜歡
- jquery Jcrop圖像裁切插件中文api文檔
- @media適配不同尺寸的手機(jī)
- 返回上一頁(yè)代碼的幾種寫(xiě)法
- Dreamweaver CC 2014新功能介紹
- 深入了解viewport和px
- 優(yōu)秀CSS代碼書(shū)寫(xiě)的10個(gè)規(guī)范
- 畫(huà)出你的風(fēng)格:HTML5創(chuàng)意畫(huà)板的設(shè)計(jì)教程
- Div中height:100%無(wú)效的解決辦法
- 網(wǎng)頁(yè)前端-網(wǎng)頁(yè)切圖命名規(guī)范
- 為網(wǎng)頁(yè)設(shè)計(jì)師而生的14個(gè)文本編輯器
- 專訪:石墨文檔產(chǎn)品總監(jiān)羅穎
- UI設(shè)計(jì)不得不知的移動(dòng)端UI尺寸適
- 光音移動(dòng)設(shè)計(jì)規(guī)范 — 表單類
- 體驗(yàn)設(shè)計(jì)中的排序問(wèn)題
- 網(wǎng)頁(yè)設(shè)計(jì)精粹 網(wǎng)頁(yè)中那些迷人的按
- aliued:響應(yīng)式設(shè)計(jì)的現(xiàn)狀與趨勢(shì)
- 10個(gè)智能對(duì)象處理的ps技巧
- 網(wǎng)頁(yè)UI - 原子設(shè)計(jì)理論(上)
- 如何通過(guò)設(shè)計(jì)提升banner點(diǎn)擊率?
- 晉小彥視覺(jué)設(shè)計(jì)系列文章(二):全屏