寫在開頭:這篇文章被我納入博客性能優化類別,是由於我認爲若是咱們要優化網站性能、提高用戶體驗,首要目標就是要知道用戶在本地請求並加載你的網頁的過程當中,到底發生了什麼,在此基礎上咱們才能更好的優化網頁。原文發表在個人我的博客: kmknkk.xincss
圖源:知乎-張秋怡html
DNS查詢順序以下,若其中一步成功則直接跳到創建連接部分:canvas
TCP三次握手(three-way handshaking)瀏覽器
TCP三次握手的的好處在於:發送方能夠確認接收方仍然在線,不會由於白髮送而浪費資源。緩存
報文首部(GET /index.html HTTP/1.1)性能優化
注意:
1.HTTP是無鏈接
、無狀態
的,即HTTP在傳輸完成後就會斷開(HTTP1.1之前),而且不會記錄訪問者的狀態。服務器
從HTTP/1.1開始才默認支持持久化鏈接,即通訊一次之後鏈接不中斷,HTTP/1.0須要手動設置:keep-alive。dom
正常來講,HTTP請求、響應方式爲每請求一次就響應一次:佈局
請求1 -> 響應1 -> 請求2 -> 響應2 -> 請求3 -> 響應3
若採用持久鏈接請求管線化方式:性能
請求1 -> 請求2 -> 請求3 -> 響應1 -> 響應2 -> 響應3
使用管線化的條件:
2.關於CR(Carriage Return,回車)和LF(Line Feed,換行)
Dos和Windows採用CR/LF表示下一行
UNIX/Linux採用LF表示下一行
MAC OS系統則採用CR表示下一行
報文首部(HTTP/1.1 200 OK)
執行如下過程:
下載資源
在聊瀏覽器渲染以前,咱們先明確一個概念: 事實上,咱們看到的頁面並非直觀所見的一層圖頁,而是由許多DOM元素渲染層(Layers)組成的,以下圖。
因此一個的頁面的渲染過程由以下幾步構成:
重繪(repaint)
:
reflow(重排)
:
reflow
常見狀況:
display:none
,減輕繪製壓力。知道了瀏覽器頁面的渲染合成過程後,咱們不可貴出一個結論:
若是咱們把會發生大量重繪重排的元素提取出來,單獨觸發一個渲染層(Layer),就不會把其餘元素一塊兒帶着重繪,這會大大提升頁面性能。
那麼如何觸發渲染層,讓GPU來加速繪製呢?最簡單的方法有如下三種:
will-change: transform; will-change: opacity; transform: translateZ(0);
PS:使用Layers來觸發GPU加速(硬件加速)也會帶來負面影響,如電量損失過快、佔用內存和GPU等。因此在使用中要注意不能濫用,在常觸發重繪和重排的元素上使用便可。