1. 一些必要的背景知識
目前使用的主流瀏覽器有五個:Internet Explorer、Firefox、Safari、Chrome 瀏覽器和 Opera。本文中以開放源代碼瀏覽器為例,即 Firefox、Chrome 瀏覽器和 Safari(部分開源)。根據 StatCounter 瀏覽器統計數據,目前(2017 年 3 月)Firefox、Safari 和 Chrome 瀏覽器的總市場占有率已達70%+。由此可見,如今開放源代碼瀏覽器在瀏覽器市場中占據了非常堅實的部分。
瀏覽器的作用,從本質上來講,就是響應請求,從服務器獲取內容,然后通過瀏覽器窗口呈現給用戶。獲取的內容包括 HTML、CSS、JS,以及圖片、文字、音頻視頻等內容信息。
瀏覽器的7大核心組成

- 用戶界面 - 包括地址欄、前進/后退按鈕、書簽菜單等。除了瀏覽器主窗口顯示的您請求的頁面外,其他顯示的各個部分都屬于用戶界面。
- 瀏覽器引擎 - 在用戶界面和渲染引擎之間傳送指令。
- 渲染引擎 - 負責顯示請求的內容。如果請求的內容是 HTML,它就負責解析 HTML 和 CSS 內容,并將解析后的內容顯示在屏幕上。
- 網絡 - 用于網絡調用,比如 HTTP 請求。其接口與平臺無關,并為所有平臺提供底層實現。
- 用戶界面后端 - 用于繪制基本的窗口小部件,比如組合框和窗口。其公開了與平臺無關的通用接口,而在底層使用操作系統的用戶界面方法。
- JavaScript 解釋器 - 用于解析和執行 JavaScript 代碼。
- 數據存儲 - 這是持久層。瀏覽器需要在硬盤上保存各種數據,例如 Cookie。新的 HTML 規范 (HTML5) 定義了“網絡數據庫”,這是一個完整(但是輕便)的瀏覽器內數據庫。
2. 現在讓我們集中于“渲染引擎”
本文所討論的瀏覽器(Firefox、Chrome 瀏覽器和 Safari)是基于兩種渲染引擎構建的。Firefox 使用的是 Gecko,這是 Mozilla 公司“自制”的。Safari 和 Chrome 使用的是 WebKit。
WebKit 是一個開源渲染引擎,起初用于 Linux 平臺,隨后由 Apple 公司進行修改,從而支持蘋果機和 Windows。詳情參閱 webkit.org。
主流程
渲染引擎一開始會從網絡層獲取請求文檔的內容,內容的大小一般限制在 8000 個塊以內。然后會按照一個基本流程進行渲染:

- 渲染引擎解析 HTML 文檔,形成一個“DOM(Document Object Model)”樹,每個 HTML 標簽都是一個 DOM 節點。
與此同時,渲染引擎也會解析 CSS 樣式數據(包括內聯及外部引入樣式)。這些樣式信息將會創建另一個樹結構:CSSOM樹。

- 構建渲染樹,Rendering Tree。

需要著重指出的是,這是一個漸進的過程。為達到更好的用戶體驗,渲染引擎會力求盡快將內容顯示在屏幕上。它不必等到整個 HTML 文檔解析完畢之后,就會開始構建呈現樹和設置布局。在不斷接收和處理來自網絡的其余內容的同時,渲染引擎會將部分內容解析并顯示出來。
渲染流程示例
WebKit 渲染流程

Mozilla 的 Gecko 引擎渲染流程

WebKit 和 Gecko 的整體渲染流程是基本相同,HTML+CSS 部分會有小的區別。
更加詳細的內容,可以通過下面兩篇文章,進一步了解。
參考: