頁面載入過程詳解和優化策略

2021-09-14 05:41:40 字數 3109 閱讀 4599

通過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的快取功能可以減少對伺服器資源的請求,一般使...