瀏覽器結構
瀏覽器的主要組件:
1、用戶界面:包括地址欄、前進/后退按鈕,書簽菜單等。除了瀏覽器主窗口用於顯示 網頁外,其他顯示的部分屬於用戶界面。
2、瀏覽器引擎:在用戶界面和渲染引擎直接傳送指令。一方面提供對渲染引擎的高級接口,另一方面提供初始化加載URL和其他用戶界面的方法,如刷新后退等 和用戶界面提供錯誤、加載進度等消息。
3、呈現引擎(渲染引擎):一般稱為“瀏覽器內核”,負責顯示請求的內容。如果請求的內容是HTML,則負責解析HTML和CSS內容並顯示 在屏幕上。其中不用瀏覽器的渲染引擎存在差異。例如IE使用Trident,Firefox使用的Mozilla公司“自制”的Gecko 渲染引擎,而Safari、Opera和Chrome瀏覽器則使用的是Webkit,一種開放源代碼呈現引擎。
4、網絡:基於互聯網HTTP和FTP協議,用於處理網絡請求,其提供接口用於為所有平台提供底層實現。
5、用戶界面后端:用戶匯總基本的窗口小部件,如組合框和窗口。
6、JavaScript解析器:用於解析和執行JavaScript代碼,並將結果傳遞到渲染引擎展示。其中 Chrome的JS解析器為基於C++的V8引擎,Firfox的是基於C的Spider-Monkey,而IE的有JScript和VBScript。
7、數據存儲:數據持久化。瀏覽器需要在硬盤上保存各種數據,例如Cookie等。
如今基本上瀏覽器的每個標簽頁都分別對應一個渲染引擎實例。即每個標簽頁除了屬於同一站點(即協議和根域名相同) 都有一個獨立的渲染進程。
但是如果頁面存在多個iframe來自不同站點,會導致不同站點中的內容通過iframe同時運行在一個渲染進程中,導致 幽靈和熔毀的漏洞,所以通過支持站點隔離實現將標簽級的渲染進程重構為iframe級的渲染進程,按照同一站點 的策略來分配渲染進程。
瀏覽器內核
瀏覽器的核心部分就是渲染引擎,其中有如下的常駐線程:
-
GUI渲染線程:負責解析HTML,CSS,構建DOM樹及頁面布局和繪制等。
-
JavaScript引擎線程:負責解析JavaScript腳本,運行代碼,一個渲染進程中只有一個 JavaScript線程在運行,所以會存在JS阻塞,另外,GUI渲染線程和JS引擎是互斥的,因為 JavaScript可通過操作DOM修改元素,所以當JavaScript執行時,GUI線程會掛起,這種情況會導致 頁面渲染阻塞,頁面渲染不連貫。
-
事件觸發線程:負責維護事件隊列,當一些事件被觸發時,該線程會把事件添加至事件隊列的末尾,等待JS引擎處理。
-
定時器線程:瀏覽器定時器會通過單獨的線程來計時並觸發定時任務。
-
異步http請求線程:在XMLHttpRequest在連接后是通過瀏覽器新開一個線程來實現,通過監聽連接 狀態的變化來將回調放入事件隊列中。
瀏覽器內部工作原理
渲染一個頁面,瀏覽器內部的工作原理:
-
瀏覽器進程:主要負責界面顯示、用戶交互、子進程管理,同時提供存儲等功能。
-
渲染進程:核心任務是將 HTML、CSS 和 JavaScript 轉換為用戶可以與之交互的網頁。
-
GPU進程:3D CSS效果,UI界面繪制。
-
網絡進程:主要負責頁面的網絡資源加載。
-
插件進程:負責插件的運行環境。
推薦閱讀
瀏覽器的高級結構:http://taligarsiel.com/Projects/howbrowserswork1.htm#Thebrowserhighlevelstructure
一文看透瀏覽器架構:https://www.jianshu.com/p/a37990edd38a