通過html5 performanc相關的api,我們可以對頁面進行效能分析。
下面會就幾個比較重要的過程進行分析,給出耗時計算方法,並針對性的給出一些優化建議。
// 下文中的timing均表示performance.timing
let timing = window.performance.timing;
網域名稱系統(英文:domain name system,縮寫:dns)是網際網路的一項服務。它作為將網域名稱和ip位址相互對映的乙個分布式資料庫,能夠使人更方便地訪問網際網路。簡單來說就是將乙個網域名稱對映到其對應的伺服器ip位址,後續的請求均傳送到該伺服器。
dns查詢的基本過程如下:
查詢瀏覽器快取
瀏覽器會快取dns查詢結果,不同的瀏覽器快取時間會有所不同。如果瀏覽器存在快取,那麼dns查詢就到此為止。
查詢系統快取
瀏覽器快取中沒有需要的資料時,就會往上找到作業系統快取。我們也可以手動配置host檔案,這樣瀏覽器會優先使用我們的配置。
查詢路由器快取
系統快取中也沒有需要的資料時,就會找到路由器。
查詢運營商dns快取
之後會向運營的伺服器(網路配置中的dns伺服器位址)請求dns資料。
遞迴搜尋
如果運營商伺服器內也沒有需要的資料時,就會開始消耗最大的遞迴搜尋。
舉個栗子m.taobao.com:
首先向根網域名稱伺服器請求頂級域com的ip位址;
獲取返回值後,向頂級域com的伺服器請求一級網域名稱taobao的ip位址;
獲取返回值後,向一級網域名稱taobao的伺服器請求二級網域名稱m的ip位址;
獲取返回值後,完成查詢,返回m.taobao.com的ip位址;
根據網路的不同,這一塊的耗時可能高達十幾秒。
耗時計算:
let dns = timing.domainlookupend - timing.domainlookupstart;
明白工作原理後我們就可以針對網域名稱解析這塊做出一些優化,下面是一些優化建議:
考慮到網域名稱解析是有時間消耗的,而且有可能消耗還不小,所以我們可以減少頁面中使用到的網域名稱數量,從而減少解析次數;
另外乙個方法是進行dns預解析,提前解析好的網域名稱位址會被快取在瀏覽器中,對其他頁面也能起到加速的作用;
httpdns,減少時延的同時還能防劫持;
耗時計算:
let tcp = timing.connectend - timing.connectstart;
優化點如下:
避免重定向,這個不解釋;
適當的合併請求,同上,減少握手次數;
長鏈結keep-alive,同上,減少握手次數;
從傳送請求到開始響應的過程。
耗時計算:
let req = timing.responsestart - timing.requeststart;
優化點如下:
避免重定向,還是不解釋;
減少請求資料量,檢查是否存在冗餘的cookie;
使用cdn,縮短傳輸鏈路;
從響應開始到資料傳輸完成的過程。
耗時計算:
let res = timing.responseend - timing.responsestart;
優化點如下:
減小html**體積,包括去冗餘以及**壓縮;
傳輸過程開啟gzip,進一步壓縮傳輸資料量;
使用cdn,縮短傳輸鏈路;
耗時計算:
let dom = timing.dominteractive - timing.domloading;
優化點如下:
簡化dom結構,刪除多餘節點,避免深層巢狀;
同步的js會阻塞解析過程,考慮對js進行分段載入,延遲載入;
let dom = timing.dominteractive - timing.domloading;
這一塊的優化點主要集中在js**層次的優化。然鵝,js的優化值得寫本書來好好念叨念叨,so,這裡就不展開了,主要給幾個點吧:
減少需要載入的檔案數,合併**;
減小變數呼叫鏈路,多次訪問到的物件成員儲存成區域性變數;
快取函式執行結果;
演算法優化,減少迭代次數,以及迭代的工作量;
縮短函式呼叫鏈;
dom和cssom解析完成,並組合成為渲染樹之後開始載入並執行defer
的指令碼。
defer
的指令碼執行完成就觸發了domcontentload
事件,同時進行的還有,css等,這些資源檔案載入完成後才是domcomplete
。
domcomplete
之後就立刻觸發load事件。
耗時計算
let domcomplete = timing.domcomplete - timing.domcontentloadedeventend;
這一塊的優化主要集中在資源層次的優化,這也是乙個比較大的專案,一樣,挑幾個點說一下:
使用css,iconfont,svg代替
根據螢幕解析度進行適配
使用合適的格式,相容的情況下,webp是個不錯的選擇
小使用data url代替
資源prefetch
lazyload
此外,domcontentloaded事件耗時
和domload事件耗時
,主要就是執行js**,優化建議參考網頁載入完成
。
以上~
優化頁面載入速度
1.js css html做gzip壓縮 不要對進行gzip壓縮 2.刪除js css html 檔案的注釋,回車符,以及無效位元組 4.css放到header中,避免白屏 5.合併js和css 壓縮js和css 6.優化快取 對沒有變化的css js,等網頁元素,直接利用客戶端的瀏覽器快取讀取來有...
頁面載入的優化
頁面的載入無非就是對資料的載入模式,而我們的每乙個外部鏈結和啥的載入都會轉化為乙個網路請求。基於這個原理,我們可以盡量的減少http的網路請求,使用可以使用精靈圖之類的 1 減少http請求 合併檔案 合併 2 優化檔案,減小其尺寸,比如縮圖,一定要按尺寸生成縮圖然後呼叫,不要在網頁中用resize...
Android WebView 優化頁面載入效果
可能有些人會說,為什麼不做native的,因為native侷限性比較大,當需要載入的內容變化情況比較大的情況時,需要頻繁的發布版本,這樣是不合理的,所以推薦使用webview來載入一些比較容易改變的內容,同時也方便多個平台的應用同時製作。開啟webview的快取功能可以減少對伺服器資源的請求,一般使...