目前的主流瀏覽器有5個:Internet Explorer、Firefox、Safari、Chrome和Opera瀏覽器。根據 StatCounter 瀏覽器統計數據,目前(截止2019 年 5 月)Firefox、Safari 和 Chrome 瀏覽器的總市場佔有率將近 83.66%。因而可知,現在開放源代碼瀏覽器在瀏覽器市場中佔據了很是堅實的部分。
以上5種瀏覽器因爲有着不一樣的瀏覽器內核,形成一樣的html頁面有着不一樣呈現。Internet Explorer的內核是Trident;Firefox的內核是Gecko;Chrome、Safari內核是Webkit;Opera的內核則是Presto。css
咱們先大體看下瀏覽器渲染關鍵路徑圖: html
瀏覽器從網絡或硬盤中得到HTML字節數據後會通過如下流程將字節解析爲DOM樹:web
<html>
、<body>
、<p>
這樣的標籤以及標籤中的字符串和屬性等都會被轉化爲令牌,每一個令牌具備特殊含義和規則)。下面經過一段HTML代碼與配圖更好的理解「字節 -> 字符 -> 令牌-> 節點對象 -> 對象模型」這個過程:瀏覽器
<html> <head> <meta name="viewport" content="width=device-width,initial-scale=1"> <link href="style.css" rel="stylesheet"> <title>Critical Path</title> </head> <body> <p>Hello <span>web performance</span> students!</p> <div><img src="test.png"></div> </body> </html> 複製代碼
瀏覽器解析遇到<link>
標籤時,瀏覽器就開始解析CSS,像構建DOM樹同樣構建CSSOM樹。style.css的代碼以下:緩存
body { font-size: 16px } p { font-weight: bold } span { color: red } p span { display: none } img { float: right } 複製代碼
在構建了DOM樹和CSSOM樹以後,瀏覽器只是擁有2個相互獨立的對象集合,DOM樹描述的文檔結構和內容,CSSOM樹描述了對應文檔的樣式規則,想要渲染出頁面,就須要將DOM樹、CSSOM樹結合在一塊兒,構建渲染樹。性能優化
渲染樹構建好後,瀏覽器獲得了每一個節點的內容與樣式,下一步就是須要計算每一個節點在瀏覽器窗口的確切位置與大小,即layout佈局。
佈局階段,從渲染樹的根節點開始遍歷,採用盒子模型的模式來表示每一個節點與其餘元素之間的距離,從而肯定每一個元素在屏幕內的位置與大小。bash
盒子模型:包括外邊距(margin),內邊距(padding),邊框(border),內容(content)。標準盒子模型width/height = content;IE盒子模型width/height = content + padding + border。服務器
當Layout佈局完成後,瀏覽器會當即發出Paint事件,開始講渲染樹繪製成像素,繪製所須要的時間跟CSS樣式的複雜度成正比,繪製完成後,用戶才能看到頁面在屏幕中的最終呈現效果。markdown
若是想更詳細地體驗瀏覽器渲染流程,可使用Chrome開發者工具中的Performance面板,錄製瀏覽器從請求直到渲染完成的過程,以下圖所示: 網絡
經過優化渲染關鍵路徑,能夠優化頁面渲染性能,減小頁面白屏時間。
<script>
標籤添加異步屬性async,這樣瀏覽器的HTML解析就不會被js文件阻塞。<link>
標籤時,瀏覽器就須要向服務器發出請求得到CSS文件,而後才繼續構建DOM樹和CSSOM樹,能夠合併全部CSS成一個文件,減小HTTP請求,減小關鍵資源往返加載的時間,優化渲染速度。今天瀏覽器渲染過程和優化方案就介紹到這裏,你們若是有更多更好的頁面性能優化方案能夠多多交流,評論區歡迎留言~~