?首先瀏覽器是一個(gè)軟件,就和qq,wechat,沒(méi)什么差別,只是功能不一樣。qq,wechat是社交類(lèi),而瀏覽器就是專(zhuān)門(mén)用來(lái)訪(fǎng)問(wèn)和瀏覽萬(wàn)維網(wǎng)頁(yè)面的客戶(hù)端軟件。
瀏覽器結(jié)構(gòu):

1. User Interface(用戶(hù)界面):
包括工具欄、地址欄、前進(jìn)/后退按鈕、書(shū)簽菜單、可視化頁(yè)面加載進(jìn)度、智能下載處理、首選項(xiàng)、打印等。除了瀏覽器主窗口顯示請(qǐng)求的頁(yè)面之外,其他顯示的部分都屬于用戶(hù)界面。
2. Browser engine(瀏覽器引擎):
瀏覽器引擎是一個(gè)可嵌入的組件,其為渲染引擎提供高級(jí)接口。
瀏覽器引擎可以加載一個(gè)給定的URI,并支持諸如:前進(jìn)/后退/重新加載等瀏覽操作。
瀏覽器引擎提供查看瀏覽會(huì)話(huà)的各個(gè)方面的掛鉤,例如:當(dāng)前頁(yè)面加載進(jìn)度、JavaScript alert。
瀏覽器引擎還允許查詢(xún)/修改渲染引擎設(shè)置。
3.?Rendering Engine(渲染引擎):
渲染引擎為指定的URI生成可視化的表示。
渲染引擎能夠顯示HTML和XML文檔,可選擇CSS樣式,以及嵌入式內(nèi)容(如圖片)。
渲染引擎能夠準(zhǔn)確計(jì)算頁(yè)面布局,可使用“回流”算法逐步調(diào)整頁(yè)面元素的位置。
渲染引擎內(nèi)部包含HTML解析器。
Chrome為每個(gè)Tab分配了各自的渲染引擎實(shí)例,每個(gè)Tab就是一個(gè)獨(dú)立的進(jìn)程。
4. Networking(網(wǎng)絡(luò))
網(wǎng)絡(luò)系統(tǒng)實(shí)現(xiàn)HTTP和FTP等文件傳輸協(xié)議。 網(wǎng)絡(luò)系統(tǒng)可以在不同的字符集之間進(jìn)行轉(zhuǎn)換,為文件解析MIME媒體類(lèi)型。 網(wǎng)絡(luò)系統(tǒng)可以實(shí)現(xiàn)最近檢索資源的緩存功能(前端小伙伴了解下,方便面試)。
5. JavaScript Interpreter(JS解釋器)
JavaScript解釋器能夠解釋并執(zhí)行嵌入在網(wǎng)頁(yè)中的JavaScript(又稱(chēng)ECMAScript)代碼。 為了安全起見(jiàn),瀏覽器引擎或渲染引擎可能會(huì)禁用某些JavaScript功能,如彈出窗口的打開(kāi)。
6. XML Parser(XML解析器)
XML解析器可以將XML文檔解析成文檔對(duì)象模型(Document Object Model,DOM)樹(shù)。 XML解析器是瀏覽器架構(gòu)中復(fù)用最多的子系統(tǒng)之一,幾乎所有的瀏覽器實(shí)現(xiàn)都利用現(xiàn)有的XML解析器,而不是從頭開(kāi)始創(chuàng)建自己的XML解析器
功能相似的HTML解析器和XML解析器為什么前者劃分在渲染引擎中,后者作為獨(dú)立的系統(tǒng)?
XML解析器對(duì)于系統(tǒng)來(lái)說(shuō),其功能并不是關(guān)鍵性的,但是從復(fù)用角度來(lái)說(shuō),XML解析器是一個(gè)通用的,可重用的組件,具有標(biāo)準(zhǔn)的,定義明確的接口。相比之下,HTML解析器通常與渲染引擎緊耦合。
7. UI Backend(顯示后端)
用來(lái)繪制類(lèi)似組合選擇框及對(duì)話(huà)框等基本組件,具有不特定于某個(gè)平臺(tái)的通用接口,底層使用操作系統(tǒng)的用戶(hù)接口。
8.?Data Persistence(數(shù)據(jù)持久層)
數(shù)據(jù)持久層將與瀏覽會(huì)話(huà)相關(guān)聯(lián)的各種數(shù)據(jù)存儲(chǔ)在硬盤(pán)上。 這些數(shù)據(jù)可能是諸如:書(shū)簽、工具欄設(shè)置等這樣的高級(jí)數(shù)據(jù),也可能是諸如:Cookie,安全證書(shū)、緩存等這樣的低級(jí)數(shù)據(jù)(前端小伙伴了解下,面試用來(lái)吹)。
瀏覽器內(nèi)核:
瀏覽器內(nèi)核負(fù)責(zé)取得網(wǎng)頁(yè)的內(nèi)容(HTML、XML、圖像等等)、整理訊息(例如加入 CSS 等),以及計(jì)算網(wǎng)頁(yè)的顯示方式,然后會(huì)輸出至顯示器或打印機(jī)。
瀏覽器的內(nèi)核的不同對(duì)于網(wǎng)頁(yè)的語(yǔ)法解釋會(huì)有不同,所以渲染的效果也不相同。所有網(wǎng)頁(yè)瀏覽器、電子郵件客戶(hù)端以及其它需要編輯、顯示網(wǎng)絡(luò)內(nèi)容的應(yīng)用程序都需要內(nèi)核。
內(nèi)核分為兩個(gè)部分:渲染引擎和js引擎,由于js引擎越來(lái)越獨(dú)立,內(nèi)核就傾向于只指渲染引擎
1. 渲染引擎
負(fù)責(zé)請(qǐng)求網(wǎng)絡(luò)頁(yè)面資源加以解析排版并呈現(xiàn)給用戶(hù),渲染引擎可以顯示html、xml文檔及圖片,它也可以借助插件顯示其他類(lèi)型數(shù)據(jù),例如使用PDF閱讀器插件,可以顯示PDF格式。
2. js引擎
JS 引擎則是解析 Javascript 語(yǔ)言,執(zhí)行 javascript 語(yǔ)言來(lái)實(shí)現(xiàn)網(wǎng)頁(yè)的動(dòng)態(tài)效果。
3. 當(dāng)前主流內(nèi)核
Trident ([‘tra?d(?)nt]):普遍稱(chēng)作 “IE內(nèi)核”
該內(nèi)核程序在 1997 年的 IE4 中首次被采用,是微軟在 Mosaic(”馬賽克”,這是人類(lèi)歷史上第一個(gè)瀏覽器,從此網(wǎng)頁(yè)可以在圖形界面的窗口瀏覽) 代碼的基礎(chǔ)之上修改而來(lái)的,并沿用到 IE11,也被普遍稱(chēng)作 “IE內(nèi)核”。
IE 從版本 11 開(kāi)始,初步支持 WebGL 技術(shù)。IE8 的 JavaScript 引擎是 Jscript,IE9 開(kāi)始用 Chakra,這兩個(gè)版本區(qū)別很大,Chakra 無(wú)論是速度和標(biāo)準(zhǔn)化方面都很出色。
Window10 發(fā)布后,IE 將其內(nèi)置瀏覽器命名為 Edge,Edge 最顯著的特點(diǎn)就是新內(nèi)核 EdgeHTML。
Gecko ([‘gek??]):Firefox 內(nèi)核
Gecko 內(nèi)核的瀏覽器Firefox (火狐) 用戶(hù)最多,所以有時(shí)也會(huì)被稱(chēng)為 Firefox 內(nèi)核,此外 Gecko 也是一個(gè)跨平臺(tái)內(nèi)核,可以在Windows、 BSD、Linux 和 Mac OS X 中使用。
Webkit:
ebkit內(nèi)核 可以說(shuō)是以硬件盈利為主的蘋(píng)果公司給軟件行業(yè)的最大貢獻(xiàn)之一。隨后,2008 年谷歌公司發(fā)布 chrome 瀏覽器,采用的 chromium 內(nèi)核便 fork 了 Webkit。
Chromium/Blink:
2008 年,谷歌公司發(fā)布了 chrome 瀏覽器,瀏覽器使用的內(nèi)核被命名為 chromium。
chromium fork 自開(kāi)源引擎 webkit,卻把 WebKit 的代碼梳理得可讀性提高很多,所以以前可能需要一天進(jìn)行編譯的代碼,現(xiàn)在只要兩個(gè)小時(shí)就能搞定。因此 Chromium 引擎和其它基于 WebKit 的引擎所渲染頁(yè)面的效果也是有出入的。所以有些地方會(huì)把 chromium 引擎和 webkit 區(qū)分開(kāi)來(lái)單獨(dú)介紹,而有的文章把 chromium 歸入 webkit 引擎中,都是有一定道理的。
谷歌公司還研發(fā)了自己的 Javascript 引擎,V8,極大地提高了 Javascript 的運(yùn)算速度。
Blink 引擎問(wèn)世后,國(guó)產(chǎn)各種 chrome 系的瀏覽器也紛紛投入 Blink 的懷抱。
Presto ([‘prest??]):opera 的 “前任” 內(nèi)核
為何說(shuō)是 “前任”,因?yàn)樽钚碌?opera 瀏覽器早已將之拋棄從而投入到了谷歌大本營(yíng)。
注釋?zhuān)篧ebkit 其實(shí)是 KHTML 的分支,這里的 KHTML 指渲染引擎,Webkit 其實(shí)就泛指了 Webkit 的渲染引擎 WebCore,而 Webkit 引擎的 Javascript 引擎 JSCore 則是 KJS 的分支。而 chrome 則搭載了自己的 Javascript 引擎 V8。引用?各主流瀏覽器內(nèi)核介紹?里的一段話(huà):我們上面提到 Chrome 是基于 WebKit 的分支,而 WebKit 又由渲染引擎 “WebCore” 和 JS 解釋引擎 “JSCore” 組成,可能會(huì)讓你搞不清 V8 和 JSCore 的關(guān)系。你可以這樣理解—— WebKit 是一塊主板,JSCore 是一塊可拆卸的內(nèi)存條,谷歌實(shí)際上認(rèn)為 Webkit 中的 JSCore 不夠好,才自己搞了一個(gè) V8 JS 引擎,這就是 Chrome 比 Safari 在某些 JS 測(cè)試中效率更高的原因。
參考文獻(xiàn):
1. 主流瀏覽器內(nèi)核介紹(前端開(kāi)發(fā)值得了解的瀏覽器內(nèi)核歷史)
3. 深入理解瀏覽器工作原理