1.減少http請求數(shù)量
到終端用戶的響應(yīng)時間80%花在前端:大部分用于下載組件(js/css/image/flash等等)。減少組件數(shù)就是減少渲染頁面所需的http請求數(shù)瓢姻。
減少組件數(shù)的一個方法就是簡化頁面設(shè)計祝蝠。保持富內(nèi)容的頁面且能減少http請求,可以從以下幾點實現(xiàn):
①幻碱,合并文件绎狭,如合并js,合并css都能減少請求數(shù)(用webpack打包)褥傍。
②儡嘶,雪碧圖可以合并多個背景圖片,通過background-image?和?background-position?來顯示不同部分恍风。
2社付,減少DNS查詢
就像電話簿承疲,你在瀏覽器地址欄輸入網(wǎng)址,通過DNS查詢得到網(wǎng)站真實IP鸥咖。
DNS查詢被緩存來提高性能燕鸽。這種緩存可能發(fā)生在特定的緩存服務(wù)器,或者用戶的計算機啼辣。DNS信息留存在操作系統(tǒng)DNS緩存中啊研,大多瀏覽器有自己的緩存,獨立于操作系統(tǒng)緩存鸥拧。只要瀏覽器在自己的緩存里有某條DNS記錄党远,它就不會向操作系統(tǒng)發(fā)DNS解析請求。
當客戶端的DNS緩存是空的富弦,DNS查找次數(shù)等于頁面中的唯一域名數(shù)沟娱。
所以:
由于DNS查找是需要時間的,而且它們通常都是只緩存一定的時間腕柜,所以應(yīng)該盡可能地減少DNS查找的次數(shù)济似。
減少DNS查找次數(shù),最理想的方法就是將所有的內(nèi)容資源都放在同一個域(Domain)下面盏缤,這樣訪問整個網(wǎng)站就只需要進行一次DNS查找砰蠢,這樣可以提高性能。
但理想總歸是理想唉铜,上面的理想做法會帶來另外一個問題台舱,就是由于這些資源都在同一個域,而瀏覽器針對每個域只有一定數(shù)量的并行度(不同瀏覽器并行數(shù)量不同)潭流,那么就會出現(xiàn)下載資源時的排隊現(xiàn)象竞惋,這樣就會降低性能。
如果想減少dns查詢灰嫉,當同源資源過多就會出現(xiàn)下載資源排隊碰声,想不排隊就又得增加DNS請求。
所以熬甫,折中的做法是:建議在一個網(wǎng)站里面使用至少2個域,但不多于4個域來提供資源蔓罚。我認為這條建議是很合理的椿肩,也值得我們在項目實踐中去應(yīng)用
3.使用CDN
CDN是一群不同地點的服務(wù)器,可以更高效地分發(fā)內(nèi)容到用戶豺谈。一些大公司有自己的CDN郑象。
用戶離你的服務(wù)器越近,響應(yīng)時間越少茬末,因此使用CDN厂榛,用戶可以以最短的路徑盖矫,最快的速度對網(wǎng)站進行訪問。因此击奶,CDN可以加速用戶訪問速度辈双,減少源站中心負載壓力。
4.HTTP緩存
緩存是一種保存資源副本并在下次請求時直接使用該副本的技術(shù)柜砾。當 web 緩存發(fā)現(xiàn)請求的資源已經(jīng)被存儲湃望,它會攔截請求,返回該資源的拷貝痰驱,而不會去源服務(wù)器重新下載证芭。這樣帶來的好處有:緩解服務(wù)器端壓力,提升性能(獲取資源的耗時更短了)担映。對于網(wǎng)站來說废士,緩存是達到高性能的重要組成部分。緩存需要合理配置蝇完,因為并不是所有資源都是永久不變的:重要的是對一個資源的緩存應(yīng)截止到其下一次發(fā)生改變(即不能緩存過期的資源)官硝。
服務(wù)器可以通過設(shè)置Cache-Control或ETag頭,來實現(xiàn)緩存四敞。
5.Cookie
http cookie的使用有多種原因泛源,比如授權(quán)和個性化。cookie的信息通過http頭部在瀏覽器和服務(wù)器端交換忿危。也就是說每次請求與響應(yīng)都會帶上cookie达箍,盡可能減小cookie的大小來降低響應(yīng)時間。
①铺厨,消除不必要的cookie缎玫。
②,盡可能減小cookie的大小來降低響應(yīng)時間解滓。
③赃磨,注意設(shè)置cookie到合適的域名級別,則其它子域名不會被影響洼裤。
④邻辉,正確設(shè)置Expires日期。早一點的Expires日期或者沒有會盡早刪除cookie腮鞍,優(yōu)化響應(yīng)時間值骇。
6.HTML文檔順序
①<link>標簽放在<head>,這樣瀏覽器就會更早得到css樣式移国,可以加快頁面樣式的渲染吱瘩。當我們將css放在底部,頁面可以正常逐步呈現(xiàn)迹缀,但在css下載并解析完畢之后使碾,已經(jīng)呈現(xiàn)的文字和圖片就要用新的樣式重繪了蜜徽,這就是“無樣式內(nèi)容的閃爍”,這將是一種不好的用戶體驗票摇。
②<script>標簽放在底部拘鞋,腳本引起的問題是它們阻塞了并行下載,當腳本在下載,瀏覽器不會再下載其它組件兄朋,即使在不同域名下掐禁。
7.壓縮代碼
壓縮JS和CSS。
壓縮就是刪除代碼中不必要的字符來減小文件大小颅和,從而提高加載速度傅事。當代碼壓縮時,注釋刪除峡扩,不需要的空格(空白蹭越,換行,tab)也被刪除教届。
8.優(yōu)化圖片
檢查gif圖片的調(diào)色板大小是否匹配圖片顏色數(shù)响鹃。
可以把gif轉(zhuǎn)成png看看有沒有變小。除了動畫案训,gif一般可以轉(zhuǎn)成png8买置。
運行pngcrush或其它工具壓縮png。
運行jpegtran或其它工具壓縮jpeg强霎。
不要在html中縮放圖片忿项,不要因為你可以設(shè)置圖片的寬高就去用比你需要的大得多的圖片,根據(jù)需求使用匹配尺寸的圖片
PS:避免空src的圖片城舞,以避免不必要的請求轩触。
9.gZip
傳輸時用gzip等壓縮組件。
我們壓縮文件的目的就是為了把傳輸文件的體積減小家夺,加快傳輸速度脱柱。我們在?http?傳輸中開啟?gZip的目的也是如此
在?http/1.0?協(xié)議中關(guān)于服務(wù)端發(fā)送的數(shù)據(jù)可以配置一個?Content-Encoding?字段,這個字段用于說明數(shù)據(jù)的壓縮方法
客戶端在接收到返回的數(shù)據(jù)后去檢查對應(yīng)字段的信息拉馋,然后根據(jù)對應(yīng)的格式去做相應(yīng)的解碼榨为。客戶端在請求時煌茴,可以用?Accept-Encoding?字段說明自己接受哪些壓縮方法随闺。
gzip一般可減小響應(yīng)的70%。盡可能去gzip更多(文本)類型的文件景馁。html,腳本逗鸣,樣式合住,xml和json等等都應(yīng)該被gzip绰精,而圖片,pdf等等不應(yīng)該被gzip透葛,因為它們本身已被壓縮過笨使,gzip它們只是浪費cpu,甚至增加文件大小僚害。