番外篇:一篇讀懂瀏覽器結構


瀏覽器結構

瀏覽器的主要組件:

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

chrome打開一個頁面需要多少進程?:https://mp.weixin.qq.com/s?__biz=MzU4ODU0NjcyOQ==&mid=2247483727&idx=1&sn=d55242b1921817adab4e3e6e09ac2dfd&chksm=fdda5689caaddf9fe9f6d36038852d9ebf7afdfa387ad9064a7b121eeef57e79ec6a6f9a3c0b&token=227086575&lang=zh_CN#rd

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM