摘要:最少化請(qǐng)求用戶在瀏覽網(wǎng)頁(yè)時(shí),超過(guò)的時(shí)間都是在請(qǐng)求下載網(wǎng)頁(yè)資源,包括圖片,樣式,腳本,等等,減少這些資源的下載請(qǐng)求數(shù)目,便成了讓網(wǎng)頁(yè)提速的關(guān)鍵。但需要提的是,中對(duì)請(qǐng)求的長(zhǎng)度限制在字節(jié)以內(nèi)參考,所以如果超過(guò)這個(gè)長(zhǎng)度,只能使用請(qǐng)求。
前端工程師常常被提起網(wǎng)站性能,如何讓網(wǎng)站訪問(wèn)更快等問(wèn)題,本文就做個(gè)總結(jié)。
最少化HTTP請(qǐng)求用戶在瀏覽網(wǎng)頁(yè)時(shí),超過(guò)80%的時(shí)間都是在請(qǐng)求下載網(wǎng)頁(yè)資源,包括圖片,樣式,腳本,F(xiàn)lash等等,減少這些資源的下載請(qǐng)求數(shù)目,便成了讓網(wǎng)頁(yè)提速的關(guān)鍵。
當(dāng)然,如果頁(yè)面很簡(jiǎn)單,資源少,網(wǎng)頁(yè)請(qǐng)求自然就少,如果網(wǎng)頁(yè)內(nèi)容很多,我們?nèi)绾巫龅綔p少資源請(qǐng)求數(shù)呢?這里有幾個(gè)方法:
合并靜態(tài)文件,將所有腳本、樣式文件合并到一個(gè)文件里,可以大大減少HTTP請(qǐng)求數(shù)。但如果每個(gè)頁(yè)面的靜態(tài)文件都不一樣,所有文件都合并到一起也會(huì)帶來(lái)麻煩,所以需要在開(kāi)發(fā)過(guò)程中均衡處理合并。
CSS雪碧圖(Sprites),將CSS中用到的背景圖片合并到一張圖片上,然后通過(guò)background-position去定位想用到的圖片塊,可以減少圖片請(qǐng)求數(shù)。
使用data: URL scheme將圖片數(shù)據(jù)寫(xiě)入到HTML或CSS文件中,雖然增加了HTML或CSS文件大小,但必要時(shí),還是需要這么做來(lái)減少HTTP請(qǐng)求數(shù)。
將CSS文件放在頭部當(dāng)頁(yè)面內(nèi)容很多時(shí),我們希望邊加載邊正確的顯示給用戶,你可能想把CSS文件放到頁(yè)面底部,這樣就可以優(yōu)先展示用戶內(nèi)容,但這會(huì)引起一個(gè)嚴(yán)重的問(wèn)題,用戶先看到的是一個(gè)沒(méi)有樣式的頁(yè)面,之后閃一下(頁(yè)面重繪)又重新定義了樣式,這其實(shí)很影響用戶體驗(yàn)。而最好的做法就是遵循HTML規(guī)范,把CSS文件放到文檔的HEAD標(biāo)簽里。
將JS文件放在底部JS腳本所引起的問(wèn)題是阻塞了瀏覽器的并行下載,HTTP/1.1規(guī)范指出:每個(gè)域名下的資源的并行下載數(shù)量不得超過(guò)兩個(gè),當(dāng)瀏覽器在下載JS文件時(shí),不會(huì)進(jìn)行其他下載,即使資源被分發(fā)在不同的域名。
避免CSS表達(dá)式如果要?jiǎng)討B(tài)設(shè)置CSS屬性,CSS表達(dá)式(CSS expressions)就顯得尤其強(qiáng)(wei)大(xian),它在IE5.0中開(kāi)始被支持,但又在IE8.0中被廢棄。比如以下樣式,背景色會(huì)在每個(gè)小時(shí)都被定義一次。
background-color: expression( (new Date()).getHours()%2 ? "#B8D4FF" : "#F08A00" );
可以看粗,expression方法接受一個(gè)Js語(yǔ)句去設(shè)置CSS屬性值,它只能被IE識(shí)別,所以在跨瀏覽器開(kāi)發(fā)時(shí)(兼容IE),它就有了用武之地。
但是它的問(wèn)題在于它執(zhí)行的非常頻繁,網(wǎng)頁(yè)渲染時(shí)執(zhí)行,窗口改變時(shí)執(zhí)行,甚至頁(yè)面滾動(dòng)時(shí)、用戶移動(dòng)鼠標(biāo)時(shí)它都會(huì)執(zhí)行!
減少CSS表達(dá)式執(zhí)行次數(shù)的方法是:當(dāng)頁(yè)面渲染完成后就給CSS屬性設(shè)定一個(gè)明確的值,或者在Js中監(jiān)聽(tīng)網(wǎng)頁(yè)事件,事件觸發(fā)時(shí)再去設(shè)置CSS屬性值。如果一定要使用CSS表達(dá)式,請(qǐng)記住,它很可能會(huì)被執(zhí)行成千上萬(wàn)次。
外鏈CSS和JS文件之所以外鏈CSS和JS文件會(huì)使頁(yè)面更快,是因?yàn)樗鼈兛梢员粸g覽器緩存,否則每次請(qǐng)求HTML文檔時(shí)都會(huì)重復(fù)下載CSS和JS代碼,雖然內(nèi)聯(lián)CSS和JS可以減少HTTP請(qǐng)求數(shù),但是使得HTML文檔更大。
如果頁(yè)面比較簡(jiǎn)單,JS和CSS都很少,使用內(nèi)聯(lián)代碼減少HTTP請(qǐng)求,反而會(huì)讓頁(yè)面更快。
壓縮靜態(tài)文件市面上的壓縮工具有很多,比如JSmin, YUI Compressor,GCC,pngcrush等等,可以根據(jù)業(yè)務(wù)需要選擇工具去壓縮靜態(tài)文件。
Ajax中優(yōu)先選擇GET請(qǐng)求使用XMLHttpRequest對(duì)象進(jìn)行POST請(qǐng)求時(shí),我們發(fā)現(xiàn),它其實(shí)是分為兩步完成,現(xiàn)發(fā)送請(qǐng)求頭信息,再發(fā)送請(qǐng)求數(shù)據(jù),所以最好使用GET請(qǐng)求,只需要發(fā)送一個(gè)TCP數(shù)據(jù)包(除非有很多Cookie數(shù)據(jù)),而且GET請(qǐng)求的數(shù)據(jù)可以被緩存。但需要提的是,IE中對(duì)GET請(qǐng)求的URL長(zhǎng)度限制在2K字節(jié)以內(nèi)(參考support.microsoft.com),所以如果URL超過(guò)這個(gè)長(zhǎng)度,只能使用POST請(qǐng)求。
延遲加載開(kāi)發(fā)過(guò)程中,想想這個(gè)元素或腳本是不是頁(yè)面初始化所必須的,如果不是,就可以考慮延遲加載它們,比如默認(rèn)被折疊的元素、需要用戶觸發(fā)才需要顯示的元素以及首屏之后的頁(yè)面元素等等。
預(yù)加載預(yù)加載看上去和上條矛盾,其實(shí)不然。當(dāng)瀏覽器處于空閑時(shí),我們可以預(yù)先加載之后會(huì)使用到的頁(yè)面的元素(比如:圖片,JS,CSS),之后頁(yè)面再使用這些元素時(shí)會(huì)優(yōu)先從緩存中讀取。預(yù)加載分為這兩種形式:
無(wú)條件預(yù)加載(Unconditional):頁(yè)面一旦加載完成就去下載額外的元素,而這個(gè)元素并不一定在這個(gè)頁(yè)面上被使用,比如Google首頁(yè)加載了一張背景圖,這是為了搜索結(jié)果頁(yè)所準(zhǔn)備的。
條件預(yù)加載(Conditional):這是基于用戶行為做出下一步猜測(cè)而去加載元素,比如當(dāng)你輸入文字時(shí)會(huì)根據(jù)文字去下載不同元素。
減少DOM數(shù)如果一個(gè)頁(yè)面太復(fù)雜,意味著下載時(shí)間更長(zhǎng),同時(shí)JS訪問(wèn)DOM的速度也會(huì)變慢。減少DOM數(shù)并不意味著需要移除內(nèi)容,而是我們可以使用更合理的HTML標(biāo)簽。還在使用Table布局?頁(yè)面一堆DIV標(biāo)簽,也許我們有更好更語(yǔ)義化的布局方法。
想知道頁(yè)面的DOM數(shù)量很簡(jiǎn)單,只需要一行JS語(yǔ)句:
document.getElementsByTagName("*").length多域名分發(fā)內(nèi)容
使用多域名分發(fā)內(nèi)容可以可以增加瀏覽器并行下載數(shù),由于DNS解析也要耗時(shí),一般2-4個(gè)域名比較合適。比如你可以把HTML或JSP,PHP等文檔文件放在www.example.org這個(gè)域名上,而把靜態(tài)文件放在static1.example.or或者static2.example.org上。
減少iframe的使用iframe可以讓HTML文檔嵌套在另一個(gè)HTML文檔內(nèi),想要更好的使用它們就必須知道它們的工作原理。
iframe優(yōu)點(diǎn):
* 延遲加載廣告等第三方內(nèi)容
* 提供安全沙箱
* 并行下載腳本
iframe缺點(diǎn):
* 代價(jià)昂貴
* 阻止父級(jí)頁(yè)面的加載
* 非語(yǔ)義化
Cookie常常被用在身份驗(yàn)證或者存儲(chǔ)個(gè)人信息,他會(huì)通過(guò)HTTP頭信息在服務(wù)端和瀏覽器之間傳輸,為了減少HTTP響應(yīng)時(shí)間,我們有必要減小Cookie。通常有以下幾個(gè)方法:
清除不必要的Cookie
盡量減小Cookie內(nèi)容的長(zhǎng)度
在適當(dāng)?shù)挠蛑性O(shè)置Cookie,保證其他子域不受影響
設(shè)定合適的Cookie的過(guò)期時(shí)間
更多關(guān)于Cookie的信息可以參考 When the Cookie Crumbles
減少DOM操作頻繁用JS操作DOM的開(kāi)銷(xiāo)很大,我們可以通過(guò)以下幾種方式減少這種開(kāi)銷(xiāo):
1. 緩存獲取到的DOM元素
2. 批量處理元素,一次性更新到文檔
3. 盡量避免用JS改變頁(yè)面布局
當(dāng)過(guò)多的元素被綁定頻繁被觸發(fā)的事件,頁(yè)面響應(yīng)會(huì)變慢,這時(shí)我們就需要采用事件委托。如果你不需要等待所有圖片下載完成,可以使用DOMContentLoaded事件來(lái)代替onload事件。
使用link而不是@import引入CSS之前提到過(guò),要將CSS文件放在HEAD標(biāo)簽里,在IE中,@import相當(dāng)于把CSS文件放到了頁(yè)面底部,所以最好不用這么使用。
避免使用CSS圖片濾鏡在IE7一下,AlphaImageLoader用于解決PNG圖片透明問(wèn)題,如果圖片設(shè)置了這個(gè)屬性,當(dāng)它在下載時(shí),會(huì)阻塞瀏覽器渲染頁(yè)面,甚至讓瀏覽器卡死,這個(gè)問(wèn)題是很?chē)?yán)重。
可緩存的favicon.icofavicon.ico是網(wǎng)站根目錄的一張圖片,即便你不在HTML中設(shè)置它,瀏覽器也會(huì)發(fā)出請(qǐng)求,并且?guī)螩ookie等信息。
想要較少favicon.ico帶來(lái)的不良影響,需要做到:
1. 文件小,最好在1K一下
2. 在HTTP header中設(shè)置適當(dāng)?shù)倪^(guò)期時(shí)間(Expires)
空的圖片src屬性有三種形式:
HTML
CSS
.class{background:url("")}
JS
var img = new Image(); img.src = "";
這么做各瀏覽器發(fā)出請(qǐng)求情況各有差異,具體如下:
* IE會(huì)向頁(yè)面的目錄發(fā)出請(qǐng)求;
* Safari和Chrome會(huì)向當(dāng)前頁(yè)面自己發(fā)出請(qǐng)求;
* Firefox 3及一下版本和Safari一樣,向當(dāng)前頁(yè)面自己發(fā)出請(qǐng)求;
* Firefox 4及以上版本和Opera不發(fā)出請(qǐng)求;
本文粗譯自http://developer.yahoo.com/performance/rules.html,有所刪減并加了很多自己的理解。如果有錯(cuò)誤或不恰當(dāng)?shù)牡胤?,歡迎指正。
有些知識(shí)點(diǎn)只是粗描淡寫(xiě),比如靜態(tài)資源并行下載數(shù)、@import各瀏覽器表現(xiàn)差異等,歡迎在評(píng)論中詳細(xì)討論。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/110853.html
摘要:最少化請(qǐng)求用戶在瀏覽網(wǎng)頁(yè)時(shí),超過(guò)的時(shí)間都是在請(qǐng)求下載網(wǎng)頁(yè)資源,包括圖片,樣式,腳本,等等,減少這些資源的下載請(qǐng)求數(shù)目,便成了讓網(wǎng)頁(yè)提速的關(guān)鍵。但需要提的是,中對(duì)請(qǐng)求的長(zhǎng)度限制在字節(jié)以內(nèi)參考,所以如果超過(guò)這個(gè)長(zhǎng)度,只能使用請(qǐng)求。 前端工程師常常被提起網(wǎng)站性能,如何讓網(wǎng)站訪問(wèn)更快等問(wèn)題,本文就做個(gè)總結(jié)。 最少化HTTP請(qǐng)求 用戶在瀏覽網(wǎng)頁(yè)時(shí),超過(guò)80%的時(shí)間都是在請(qǐng)求下載網(wǎng)頁(yè)資源,包括...
摘要:最初,也在使用,并且最初看來(lái)功能安好。和的區(qū)別最大的區(qū)別在于托管于而不是。存在的問(wèn)題在使用中,我們發(fā)現(xiàn)存在的問(wèn)題主要表現(xiàn)在兩方面。使用考慮到的獨(dú)立性,我們?cè)O(shè)計(jì)了一個(gè)來(lái)管理所有,并使用和建立通訊。 在 FoxOne 1.5.1 版更新中,打開(kāi)各個(gè)交易所網(wǎng)頁(yè)的速度得到了巨大提升。 我們分別在不同的網(wǎng)絡(luò)環(huán)境下,測(cè)算了新版 FoxOne 在 Dom 加載和頁(yè)面加載條件下的所需時(shí)間: showI...
摘要:,谷歌給的一份性能指南和最佳實(shí)踐。目前而言,前端社區(qū)有三大框架和。隨后重點(diǎn)講述了和兩大前端框架,給出了大量的文章教程和相關(guān)資源列表。我認(rèn)為,使用函數(shù)式編程方式,更加符合后端程序員的思路,而是更符合前端工程師習(xí)慣的框架。 showImg(https://segmentfault.com/img/bVbjQAM?w=1142&h=640); 這個(gè)是我訂閱 陳皓老師在極客上的專欄《左耳聽(tīng)風(fēng)》...
摘要:,谷歌給的一份性能指南和最佳實(shí)踐。目前而言,前端社區(qū)有三大框架和。隨后重點(diǎn)講述了和兩大前端框架,給出了大量的文章教程和相關(guān)資源列表。我認(rèn)為,使用函數(shù)式編程方式,更加符合后端程序員的思路,而是更符合前端工程師習(xí)慣的框架。 showImg(https://segmentfault.com/img/bVbjQAM?w=1142&h=640); 這個(gè)是我訂閱 陳皓老師在極客上的專欄《左耳聽(tīng)風(fēng)》...
摘要:特意對(duì)前端學(xué)習(xí)資源做一個(gè)匯總,方便自己學(xué)習(xí)查閱參考,和好友們共同進(jìn)步。 特意對(duì)前端學(xué)習(xí)資源做一個(gè)匯總,方便自己學(xué)習(xí)查閱參考,和好友們共同進(jìn)步。 本以為自己收藏的站點(diǎn)多,可以很快搞定,沒(méi)想到一入?yún)R總深似海。還有很多不足&遺漏的地方,歡迎補(bǔ)充。有錯(cuò)誤的地方,還請(qǐng)斧正... 托管: welcome to git,歡迎交流,感謝star 有好友反應(yīng)和斧正,會(huì)及時(shí)更新,平時(shí)業(yè)務(wù)工作時(shí)也會(huì)不定期更...
閱讀 3988·2021-10-12 10:12
閱讀 1668·2021-10-11 10:58
閱讀 2506·2021-10-09 10:01
閱讀 2766·2021-09-24 09:48
閱讀 2865·2021-09-09 11:38
閱讀 3668·2019-08-30 15:44
閱讀 1886·2019-08-30 14:22
閱讀 677·2019-08-29 12:42