摘要:值得注意不同的瀏覽器使用不同的。今天截至年月,在瀏覽器進程中運行。這意味著瀏覽器進程包含一個實例,這是一個潛在的安全漏洞。
本文由云+社區(qū)發(fā)表
作者:廖彩明
在從事前端開發(fā)過程中,瀏覽器作為最重要的開發(fā)環(huán)境,瀏覽器基礎是是前端開發(fā)人員必須掌握的基礎知識點,它貫穿著前端的整個網絡體系。對瀏覽器原理的了解,決定著編寫前端代碼性能的上限。瀏覽器作為JS的運行環(huán)境,學習總結下現(xiàn)代瀏覽器的相關知識
前言經常聽說瀏覽器內核,瀏覽器內核究竟是什么,以及它做了什么。我們將來了解下瀏覽器的主要組成部分、現(xiàn)代瀏覽器的主要架構、瀏覽器內核、瀏覽器內部是如何工作的
1 瀏覽器現(xiàn)代瀏覽器結構如下:
The browser"s main component
The User Interface主要提供用戶與Browser Engine交互的方法。其中包括:地址欄(address bar)、向前/退后按鈕、書簽菜單等等。瀏覽器除了渲染請求頁面的窗口外的所有地方都屬于The User InterfaceThe Browser Engine
協(xié)調(主控)UI和the Rendering Engine,在他們之間傳輸指令。 提供對The Rendering Engine的高級接口,一方面它提供初始化加載Url和其他高級的瀏覽器動作(如刷新、向前、退后等)方法。另一方面Browser Engine也為User Interface提供各種與錯誤、加載進度相關的消息。The Rendering Engine
為給定的URL提供可視化的展示。它解析JavaScript、Html、Xml,并且User Interface中展示的layout。其中關鍵的組件是Html解析器,它可以讓Rendering Engine展示差亂的Html頁面。 值得注意:不同的瀏覽器使用不同的Rendering Engine。例如IE使用Trident,F(xiàn)irefox使用Gecko,Safai使用Webkit。Chrome和Opera使用Webkit(以前是Blink)The Networking
基于互聯(lián)網HTTP和FTP協(xié)議,處理網絡請求。網絡模塊負責Internet communication and security,character set translations and MIME type resolution。另外網絡模塊還提供獲得到文檔的緩存,以減少網絡傳輸。為所有平臺提供底層網絡實現(xiàn),其提供的接口與平臺無關The JavaScript Interpreter
解釋和運行網站上的js代碼,得到的結果傳輸?shù)絉endering Engine來展示。The UI Backend
用于繪制基本的窗口小部件,比如組合框和窗口。而在底層使用操作系統(tǒng)的用戶界面方法,并公開與平臺無關的接口。The Data Storage
管理用戶數(shù)據(jù),例如書簽、cookie和偏好設置等。2 主流瀏覽器的架構 2.1 FireFox
FireFox的架構
可以看到火狐瀏覽器的渲染引擎(Rendering Engine)使用的是Gecko;XML Parser解析器是Expat;Java Script解釋器是Spider-Monkey(c語言實現(xiàn))
2.2 ChromeChrome的架構
渲染引擎Rendering Engine使用的是WebKit
XML Parser: libXML解析XML,libXSLT處理XSLT
JS解釋器使用C++實現(xiàn)的V8引擎,
2.3 IEIE的架構
渲染引擎主要是Trident
Scripting Engine有JScript和VBScript
3 瀏覽器內核瀏覽器最重要或者說核心的部分是“Rendering Engine”,可大概譯為“渲染引擎”,不過我們一般習慣將之稱為“瀏覽器內核”。主要包括以下線程:
3.1 瀏覽器 GUI 渲染線程,主要包括:? HTML Parser 解析HTML文檔,將元素轉換為樹結構DOM節(jié)點,稱之為Content Tree3.2 JavaScript 引擎線程? CSS Parser 解析Style數(shù)據(jù),包括外部的CSS文件以及在HTML元素中的樣式,用于創(chuàng)建另一棵樹,調用“Render Tree”
? Layout過程 為每個節(jié)點計算出在屏幕中展示的準確坐標
? Painting 遍歷Render Tree,調用UI Backend提供的接口繪制每個節(jié)點
JS引擎線程負責解析Javascript腳本,運行代碼 JS引擎一直等待著任務隊列中任務的到來,然后加以處理,一個Tab頁(renderer進程)中無論什么時候都只有一個JS線程在運行JS程序
GUI渲染線程與JS引擎線程是互斥的,所以如果JS執(zhí)行的時間過長,這樣就會造成頁面的渲染不連貫,導致頁面渲染加載阻塞
a) 減少 JavaScript 加載對 DOM 渲染的影響(將 JavaScript 代碼的加載邏輯放在 HTML 文件的尾部,減少對渲染引擎呈現(xiàn)工作的影響; b) 避免重排,減少重繪(避免白屏,或者交互過程中的卡頓; c) 減少 DOM 的層級(可以減少渲染引擎工作過程中的計算量; d) 使用 requestAnimationFrame 來實現(xiàn)視覺變化(一般來說我們會使用 setTimeout 或 setInterval 來執(zhí)行動畫之類的視覺變化,但這種做法的問題是,回調將在幀中的某個時點運行,可能剛好在末尾,而這可能經常會使我們丟失幀,導致卡頓)3.3 瀏覽器定時觸發(fā)器線程
瀏覽器定時計數(shù)器并不是由 JavaScript 引擎計數(shù)的, 因為 JavaScript 引擎是單線程的, 如果處于阻塞線程狀態(tài)就會影響記計時的準確, 因此通過多帶帶線程來計時并觸發(fā)定時是更為合理的方案3.4 瀏覽器事件觸發(fā)線程
當一個事件被觸發(fā)時該線程會把事件添加到待處理隊列的隊尾,等待 JavaScript 引擎的處理。這些事件可以是當前執(zhí)行的代碼塊如定時任務、也可來自瀏覽器內核的其他線程如鼠標點擊、AJAX 異步請求等,但由于 JavaScript 的單線程關系所有這些事件都得排隊等待 JavaScript 引擎處理。3.5 瀏覽器 http 異步請求線程
在 XMLHttpRequest 在連接后是通過瀏覽器新開一個線程請求, 將檢測到狀態(tài)變更時,如果設置有回調函數(shù),異步線程就產生狀態(tài)變更事件放到 JavaScript 引擎的處理隊列中等待處理。4 以Chrome瀏覽器為例,演示瀏覽器內部如何工作
上面鋪墊了這么多理論,下面結合Chrome講解當用戶在地址欄上輸入URL后,瀏覽器內部都做了寫什么
4.1 Chrome瀏覽器中的多進程打開Chrome 任務管理器,可以看到
Chrome運行的進程
各個進程的功能
? Browser進程
功能:Controls "chrome" part of the application including address bar, bookmarks, back and forward buttons. Also handles the invisible, privileged parts of a web browser such as network requests and file access.
? GPU進程
功能:Handles GPU tasks in isolation from other processes. It is separated into different process because GPUs handles requests from multiple apps and draw them in the same surface.
? 第三方插件進程
功能:Controls any plugins used by the website, for example, flash. 每個插件對應一個進程,當插件運行時創(chuàng)建
? 瀏覽器渲染進程
功能:Controls anything inside of the tab where a website is displayed. 默認每個標簽頁創(chuàng)建一個渲染引擎實例。
? V8 Proxy resolver
關于V8 Proxy resolver可查看
code.google.com
group.google.com https://groups.google.com/a/c...!topic/net-dev/73f9B5vFphI
doc.google.com
Chrome支持使用代理腳本為給定的網址選擇代理服務器,包含使用操作系統(tǒng)提供的代理解析程序的多個平臺的回退實現(xiàn)。但默認情況下(iOS除外),它使用內置的解析V8執(zhí)行代理腳本(V8 pac)。今天(截至2015年1月),V8 pac在瀏覽器進程中運行。這意味著瀏覽器進程包含一個V8實例,這是一個潛在的安全漏洞。在瀏覽器進程中允許V8還需要瀏覽器進程允許寫入 - 執(zhí)行頁面。
我們關于將V8 pac遷移到多帶帶進程的建議包括為解析器創(chuàng)建Mojo服務,從實用程序進程導出該服務,以及從瀏覽器進程創(chuàng)建/連接到該進程。
瀏覽器進程之間主要通過IPC (Inter Process Communication)通信
4.2 Per-frame renderer processes - Site IsolationSite Isolation is a recently introduced feature in Chrome that runs a separate renderer process for each cross-site iframe. We’ve been talking about one renderer process per tab model which allowed cross-site iframes to run in a single renderer process with sharing memory space between different sites. Running a.com and b.com in the same renderer process might seem okay. The Same Origin Policy is the core security model of the web; it makes sure one site cannot access data from other sites without consent. Bypassing this policy is a primary goal of security attacks. Process isolation is the most effective way to separate sites. With Meltdown and Spectre, it became even more apparent that we need to separate sites using processes. With Site Isolation enabled on desktop by default since Chrome 67, each cross-site iframe in a tab gets a separate renderer process.
每個iframe是多帶帶的渲染進程
此文已由騰訊云+社區(qū)在各渠道發(fā)布
獲取更多新鮮技術干貨,可以關注我們騰訊云技術社區(qū)-云加社區(qū)官方號及知乎機構號
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://systransis.cn/yun/102099.html
摘要:兩個序號,三個標志位含義表示所傳數(shù)據(jù)的序號。正常通信時為,第一次發(fā)起請求時因為沒有需要確認接收的數(shù)據(jù)所以為。終止位,用來在數(shù)據(jù)傳輸完畢后釋放連接。手機網站如,填寫。中的用法普通的用法分為和兩大類。 網站架構及其演變過程 基礎結構 網絡傳輸分解方式: 標準的 OSI 參考模型 TCP/IP 參考模型 showImg(https://segmentfault.com/img/remot...
摘要:開頭正式開啟我入職的里程,現(xiàn)在已是工作了一個星期了,這個星期算是我入職的過渡期,算是知道了學校生活和工作的差距了,總之,盡快習慣這種生活吧。當時是看的廖雪峰的博客自己也用做爬蟲寫過幾篇博客,不過有些是在前人的基礎上寫的。 showImg(https://segmentfault.com/img/remote/1460000010867984); 開頭 2017.08.21 正式開啟我...
摘要:對于函數(shù)的柯里化應該不陌生,簡單來說技術是一種通過把多個參數(shù)填充到函數(shù)體中,實現(xiàn)將函數(shù)轉換為一個新的經過簡化的使之接受的參數(shù)更少函數(shù)的技術。 對于函數(shù)的柯里化(currying)應該不陌生,簡單來說 Currying 技術是一種通過把多個參數(shù)填充到函數(shù)體中,實現(xiàn)將函數(shù)轉換為一個新的經過簡化的(使之接受的參數(shù)更少)函數(shù)的技術。當發(fā)現(xiàn)正在調用同一個函數(shù)時,并且傳遞的參數(shù)絕大多數(shù)都是相同的,...
摘要:如題先陳述下問題背景偶爾測測自己寫的計算器,隨便輸入玩嘛,然后發(fā)生下面詭異的事情當我從一個輸入到十個的時候,過程顯示都是正確的,像這樣繼續(xù)輸入一個的時候,然后就這個樣子了什么原因呢看了下自己的代碼,代碼重要部分長這樣的這里用了一下強制轉化為 如題 先陳述下問題背景 偶爾測測自己寫的計算器,隨便輸入玩嘛,然后發(fā)生下面詭異的事情:當我從一個 1 輸入到十個 1 的時候,過程顯示都是正確的...
摘要:通過上面的圖,可以看到這三個類直接實現(xiàn)三個接口。如果配置不合法或者需要的參數(shù)丟失或者子類初始化發(fā)生錯誤,那么就會拋出異常日志代碼刪除了從參數(shù)設置屬性。參與了創(chuàng)建工作,并沒有涉及請求的處理。小結本章分析了的請求處理的過程。 Spring MVC showImg(https://segmentfault.com/img/remote/1460000010193590); Spring MV...
閱讀 3254·2021-11-10 11:35
閱讀 1340·2019-08-30 13:20
閱讀 1162·2019-08-29 16:18
閱讀 2187·2019-08-26 13:54
閱讀 2200·2019-08-26 13:50
閱讀 996·2019-08-26 13:39
閱讀 2535·2019-08-26 12:08
閱讀 1995·2019-08-26 10:37