瀏覽器渲染整體來講分爲如下幾步javascript
請求頁面
DOM樹
CSSOM樹
渲染樹(RENDER TREE)
佈局(layout)
繪製(painting)
到界面上網絡部分放到TCP協議中,在這就很少說了css
DOM樹和CSSOM樹的構建流程很是像,就以DOM樹爲例html
瀏覽器從服務器獲取的是16進制文件流,好比3C 62 6F 64 79 3E 48 65.....
,瀏覽器要把16進制的Bytes轉化成字符串,再遍歷這個字符串解析成tokensvue
瀏覽器是怎麼將字符串解析成tokens的。使用的方法是狀態機
。java
狀態機怎麼執行的react
- 接受到<字符。多是一個標籤的開頭,開啓一個狀態
- 下一個字符是字母,就是標籤名
- 下一個字符是!,就是註釋
- ....
- 接受到非<字符。多是一個文本節點,開啓一個狀態
- ....
瀏覽器一步步將文件流轉化爲字符串再經過狀態機轉化爲token,獲得token後,按照W3C規則轉換成DOM樹。css3
簡單總結下:後端
須要注意的事:瀏覽器
瀏覽器根據DOM樹和CSSOM樹生成帶有標籤和樣式信息的渲染樹(Render Tree)。渲染樹與DOM樹不是一一對應的關係,不顯示的節點不會出如今渲染樹上。緩存
根據渲染樹提供的節點和樣式,計算元素在視口中的確切的大小和位置。
將元素計算後的大小和位置渲染到頁面上的過程。渲染樹的繪製工做是瀏覽器調用UI後端組件完成的。
一些操做會引起元素位置或者大小的變化,這樣瀏覽器須要從新進行Lauout計算(迴流/重排),重排完成後,瀏覽器須要從新繪製(重繪)。
若是是改變一些基礎樣式好比顏色,則不須要重排,只須要重繪便可。
重繪不必定會迴流,可是迴流必定會觸發重繪
瀏覽器自上而下讀取代碼,讀取到資源文件
使用css有三種方式:使用link、@import、內聯樣式,其中link和@import都是導入外部樣式。它們之間的區別:
另外外部樣式若是長時間沒有加載完畢,瀏覽器爲了用戶體驗,會使用瀏覽器會默認樣式,確保首次渲染的速度。因此css通常寫在headr中,讓瀏覽器儘快發送請求去獲取css樣式。
JavaScript執行線程與GUI渲染線程不能同時執行,這就意味着執行js代碼勢必會阻塞頁面渲染。爲了避免阻塞頁面的渲染,能夠:
關於<script>
、<script defer>
、<script async>
的區別(配合圖片食用更佳)
<script>
:當即中止頁面渲染去加載資源文件,當資源加載完畢後當即執行js代碼,js代碼執行完畢後繼續渲染頁面<script defer>
:開闢新的線程去加載資源文件,當資源加載完畢後等待頁面渲染,頁面渲染完畢後再執行js代碼<script async>
:開闢新的線程去加載資源文件,當資源加載完畢後當即執行js代碼,js代碼執行完畢後繼續渲染頁面(特別注意:多個async js執行順序是按照加載完畢的順序,非js請求順序)\ | 阻塞頁面渲染(GUI線程) | 當即加載js資源 | js加載完畢後當即執行 | 按照script標籤順序執行腳本 |
---|---|---|---|---|
script | 是 | 是 | 是 | 是 |
defer | 否 | 是 | 否 | 是 |
async | 否 | 是 | 是 | 否 |
onload:是頁面資源加載完畢,包括圖片、視頻資源
DOMContentLoaded:DOM渲染完成
瞭解這麼多,最終仍是要爲了性能優化服務。除了已經提過的減小回流的優化外,還有: