文章同步到github《Webkit技術內幕》之頁面渲染過程 html
最近拜讀了傳說中的《Webkit技術內幕》一書,有很大收穫,尤爲是對頁面渲染有了較深的認識。因爲功力有限,並且書中設計到較多的底層也沒法理解,因此本文主要整理和分享一下本身理解的基於Webkit內核瀏覽器的頁面渲染的總體過程,不作深刻介紹(也作不了深刻介紹)。
瀏覽器之因此能呈現出更重頁面,正是因爲瀏覽器內核的存在,也被稱爲渲染引擎,主要做用就是,也就是能把HTML/CSS/JavaScript文本其相關的資源轉化轉化成可視化可交互的圖像頁面,這個過程就是渲染。
內核 | 瀏覽器 | 內核識別碼 |
---|---|---|
Trident | IE、360 | -ms |
Gecko | Firefox(火狐) | -moz |
presto | Opera(歐朋) | -o |
Webkit | Chrome(谷歌) safari(蘋果) | -webkit |
本文主要是基於Webkit內核,因此先放一張整理Webkit架構圖(並不是所有模塊, 主要包含主要模塊),大體介紹一下Webkit的架構前端
自下而上主要分爲三層:java
由Webkit能夠運行在不一樣的操做系統上,瀏覽器也能夠運行在不一樣的操做系統上,另外與對磁盤和內存的操做都須要操做系統來操做,因此須要操做系統支持。說白了就是一切須要對硬件操做的程序都須要操做系統的支持。linux
資源的獲取、頁面的渲染等須要依賴第三方庫來完成,網絡庫、圖形庫、視頻庫等都是Webkit之因此能工做的基礎,Webkit來根據須要來使用相應的庫。git
WebKitCore部分是全部瀏覽器共享的部分,是渲染網頁的基礎,包括HTML解釋器、CSS解釋器、SVG、DOM、渲染樹等github
解釋HTML文本的解釋器,把html文檔解析成DOM(文檔對象模型)樹,表示整個html文檔
問DOM樹中各個元素對象計算出樣式信息,後計算後面的網頁佈局作基礎
把DOM樹和解析後的CSS樹的信息結合起來,造成一個包含頁面全部元素和樣式的信息的一個內部表示模型
使用第三方依賴的庫如2D/3D圖形庫等將佈局計算後的節點繪製成圖像
對於JavaScript引擎有必要說一下,JavaScript引擎就是將JavaScript代碼解析處理並運行的環境,負責整個JavaScript程序的編譯及執行過程。web
1.webkit默認的引擎是JavaScriptCore引擎,對於不一樣瀏覽器對於引擎的實現JavaScript引擎的實現也不同,好比Chrome瀏覽器是基於V8引擎等。後端
2.另外在解析/語法分析,構建出"抽象語法樹"以後,會將"抽象語法樹"進行編譯,轉化爲一組機器指令,拿一個例子來講瀏覽器
var a = 1
JavaScript會建立一個變量a,並分配內存,將1這個值存儲在a的變量中。緩存
3.JavaScript能夠修改網頁內容,也就是修改DOM和和CSS樣式,事實上,也正是javaScript代碼經過DOM和CSSOM暴露出的接口來進行修改,從而改變頁面渲染的效果
綁定層和嵌入式接口層最主要與Webkit項目的移植有關,就好比基於linux內核的CentOS、Ubuntu等系統同樣。嵌入式接口層主要提供給瀏覽器調用,不一樣瀏覽器廠商會基Webkit以及對外暴露的接口實現本身的功能。
從輸入url開始總體介紹一下頁面的渲染流程,而後具體步驟再詳細加以說明
上面介紹了頁面從輸入url發送請求後到頁面渲染的總體流程,下面補充一下在這整個過程當中的一些細節知識點,方面更好的理解頁面的渲染過程
1. 首先理解頁面是分層次的,好比說以下代碼片斷代碼
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <div> <p>aaa</p> <video src="xxx.mp4"></video> </div> </body> </html>
當網頁構建層次的時候,html元素爲根層,此時建立一個層,html元素的全部子節點、子節點的子節點,依次類推,如dody,div,p爲普通元素,並不會建立新的層次接口,video元素須要進行建立新層來進行視頻處理和渲染。
以下狀況,都須要創建新的RenderLayer節點
備註: 圖片直接截取於《Webkit技術內幕》
2.從資源字節流到構建成DOM樹
備註: 圖片直接截取於《Webkit技術內幕》
如 var a = 1; var、a、=、1 、;。空格是否會被看成詞法單元,取決於空格在
這門語言中是否具備意義。
3.HTML文檔對應的DOM樹的對應關係
4.DOM樹和RenderObject樹之間的對應關係
備註: 圖片直接截取於《Webkit技術內幕》
5. RenderObject樹與RenderLayer樹之間的對應關係
多對一的關係,RenderObject多個節點能夠對應RenderLayer的一個層次結構
備註: 圖片直接截取於《Webkit技術內幕》
以上文章就是整理的頁面渲染總體流程,不少細節沒有具體講,好比解析html文檔時,利用棧來處理、繪製3D圖形的GPU加速等、因爲能力有限不敢多講,也難講清楚,這些仍是去看大神們具體的書比較,感興趣的小夥伴,《WebKit技術內幕》瞭解一下
本文主要參考資料: