瀏覽器是怎樣工作的二:渲染引擎 HTML解析

2020-12-14 站長之家
首頁

 > 

評論

 > 

關鍵詞

 > 

瀏覽器最新資訊

 > 

正文

瀏覽器是怎樣工作的二:渲染引擎 HTML解析

渲染引擎

渲染引擎的職責是……渲染,也就是把請求的內容顯示到瀏覽器屏幕上。

默認情況下渲染引擎可以顯示HTML,XML文檔以及圖片。 通過插件(瀏覽器擴展)它可以顯示其它類型文檔。比如使用PDF viewer插件顯示PDF文件。我們會在一個專門的章節討論插件與擴展。在這一節我們將專注渲染引擎的主要用途——顯示用CSS格式化的HTML與圖片。

各種渲染引擎

我們提到的Firefox, Safari兩種瀏覽器構建於兩種渲染引擎之上:Firefox使用Gecko —— Mozilla自家的渲染引擎;Safari 和 Chrome 都使用 Webkit。

Webkit 是一個開源的渲染引擎,它源自Linux平臺上的一個引擎,經過Apple公司的修改可以支持Mac與Windows平臺。更多信息可以參考: https://webkit.org/ 。

主要流程

渲染引擎開始於從網絡層獲取請求內容,一般是不超過8K的數據塊。接下來就是渲染引擎的基本工作流程:

 

圖 2:渲染引擎的基本工作流程(解析HTML構建DOM樹,渲染樹構建,渲染樹布局,繪製渲染樹)。

渲染引擎會解析HTML文檔並把標籤轉換成內容樹中的DOM節點。它會解析style元素和外部文件中的樣式數據。樣式數據和HTML中的顯示控制將共同用來創建另一棵樹——渲染樹。

渲染樹包含帶有顏色,尺寸等顯示屬性的矩形。這些矩形的順序與顯示順序一致。

渲染樹構建完成後就是"布局"處理,也就是確定每個節點在屏幕上的確切顯示位置。 下一個步驟是 繪製 —— 遍歷渲染樹並用UI後端層將每一個節點繪製出來。

一定要理解這是一個緩慢的過程,為了更好的用戶體驗,渲染引擎會嘗試儘快的把內容顯示出來。它不會等到所有HTML都被解析完才創建並布局渲染樹。它會 在處理後續內容的同時把處理過的局部內容先展示出來。

主要流程示例

圖 3:Webkit主要流程

圖 4:Mozilla的Gecko渲染引擎主要流程(3.6)

從圖3和圖4中可以看出,儘管Webkit與Gecko使用略微不同的術語,這個過程還是基本相同的。
Gecko 裡把格式化好的可視元素稱做"幀樹"(Frame tree)。每個元素就是一個幀(frame)。 Webkit 則使用"渲染樹"這個術語,渲染樹由"渲染對象"組成。Webkit 裡使用"layout"表示元素的布局,Gecko則稱為"Reflow"。Webkit使用"Attachment"來連接DOM節點與可視化信息以構建渲染樹。一個非語義上的小差別是Gecko在HTML與DOM樹之間有一個附加的層 ,稱作"content sink",是創建DOM對象的工廠。我們會討論流程中的每一部分。 

解析

因為解析是渲染引擎中一個很重要的處理,我們會講的略深入一些。讓我們從一個小的解析介紹開始。

解析一個文檔意味著把它翻譯成有意義的結構以供代碼使用。解析的結果通常是一個表徵文檔的由節點組成的樹,稱為解析樹或句法樹。

示例——解析表達式"2 + 3 – 1″可以返回下面的樹:

圖 5:數學表達式樹節點

語法

解析是基於文檔所遵循的語法規則——書寫所用的語言或格式——來進行的。每一種可以解析的格式必須由確定的語法與詞彙組成。這被稱之為上下文無關語法。 人類語言並非此種語言,所以不能用常規的解析技術來解析。

解析器——詞法分析器組合

解析器有兩個處理過程——詞法分析與句法分析。

詞法分析負責把輸入切分成符號序列,符號是語言的詞彙——由該語言所有合法的單詞組成。

句法分析是對該語言句法法則的應用。

解析器通常把工作分給兩個組件——分詞程序負責把輸入切分成合法符號序列,解析程序負責按照句法規則分析文檔結構和構建句法樹。詞法分析器知道如何過濾像空格,換行之類的無關字符。

圖 6:從源文檔到解析樹(文檔,詞法分析,句法分析,解析樹)。

解析過程是交互式的。解析器通常會從詞法分析器獲取新符號並嘗試匹配句法規則。如果匹配成功,就在句法樹上創建相應的節點,並繼續從詞法分析器獲取下一個符號。如果沒有匹配的規則,解析器會內部保存這個符號,並繼續從詞法分析器獲取符號,直到內部保存的所有符號能夠成功匹配一個規則。如果最終無法匹配,解析器會拋出異常。這意味著文檔無效,含有句法錯誤。

轉換

多數情況下解析樹並非最終結果。解析經常是為了從輸入文檔轉換成另外一種格式。比如編譯器要把源碼編譯成機器碼,會首先解析成解析樹,再把解析樹轉換成機器碼。

圖 7:編譯過程(源碼,解析,解析樹,轉換,機器碼)。

相關焦點

  • 瀏覽器加載解析渲染網頁原理
    下面是一個縮減版的資源請求原理圖:實質上的操作是在資源對象中找到對應資源的物理地址(url),然後返回給渲染引擎,渲染引擎在渲染頁面時根據url獲取物理內存中的資源數據。由於資源的唯一特性是url,所以當兩個資源有不同的url,但是他們的內容完全相同時,也不會被認定是同一個資源。
  • [圖]蒼月瀏覽器26.0版本發布 啟用新Goanna渲染引擎
    Moonchild Productions於今天正式推出了蒼月瀏覽器(Pale Moon) 26.0,這是自2014年10月以來發布的首個重大更新版本。
  • 瀏覽器引擎 Servo 成為 Linux 基金會託管項目
    Servo 是使用 Rust 開發的實驗性瀏覽器引擎,與其他瀏覽器引擎相比,Servo 在內存安全性、速度和並發性方面具有優勢。Firefox Quantum 時期,Servo 就已被用作 Firefox 的 CSS 解析引擎,到現在,Firefox 已整合多個 Servo 組件。
  • 程式設計師:HTML、CSS、JavaScript是如何變成頁面的?
    從輸入HTML、CSS、JavaScript到瀏覽器渲染出我們預期的效果,渲染流程分為這幾個子階段:構建DOM樹、樣式計算、布局階段、分層、繪製、分塊、光柵化和合成。小結前三個階段:在HTML頁面內容被提交給瀏覽器渲染引擎後,渲染引擎首先將HTML解析為瀏覽器可以理解的DOM;然後根據CSS樣式表,計算出DOM數所有節點的樣式;接著又計算每個元素的幾何坐標位置,並將這些信息保存在布局樹中。
  • Dom樹 CSS樹 渲染樹(render樹) 規則、原理
    瀏覽器將HTML解析成樹形的數據結構,簡稱DOM。 DOM 是文檔對象模型 (Document Object Model) 的縮寫。它是 HTML 文檔的對象表示,同時也是外部內容(例如 JavaScript)與 HTML 元素之間的接口。解析樹的根節點是Document對象。
  • 前端面試那些坑之HTML篇
    DOCTYPE>聲明位於位於HTML文檔中的第一行,處於<html> 標籤之前。告知瀏覽器的解析器用什麼文檔標準解析這個文檔。DOCTYPE不存在或格式不正確會導致文檔以兼容模式呈現。(2)、標準模式的排版和JS運作模式都是以該瀏覽器支持的最高標準運行。在兼容模式中,頁面以寬鬆的向後兼容的方式顯示,模擬老式瀏覽器的行為以防止站點無法工作。
  • 超全整理前端開發面試題——HTML篇(2016年)
    DOCTYPE>聲明位於位於HTML文檔中的第一行,處於 <html> 標籤之前。告知瀏覽器的解析器用什麼文檔標準解析這個文檔。DOCTYPE不存在或格式不正確會導致文檔以兼容模式呈現。(2)標準模式的排版 和JS運作模式都是以該瀏覽器支持的最高標準運行。在兼容模式中,頁面以寬鬆的向後兼容的方式顯示,模擬老式瀏覽器的行為以防止站點無法工作。
  • 「學習筆記」HTML基礎
    「瀏覽器」是網頁顯示、運行的平臺。「瀏覽器內核」(排版引擎、解釋引擎、渲染引擎)負責讀取網頁內容,整理訊息,計算網頁的顯示方式並顯示頁面。chromeChromium/Blink在 Chromium 項目中研發 Blink 渲染引擎(即瀏覽器核心),內置於 Chrome 瀏覽器之中。Blink 其實是 WebKit 的分支。大部分國產瀏覽器最新版都採用Blink內核。二次開發Operablink現在跟隨chrome用blink內核。
  • Chromium 項目宣布放棄 WebKit 渲染引擎
    Chromium 項目宣布放棄 WebKit 渲染引擎 Chromium 項目宣布將放棄 WebKit 渲染引擎,並將基於 WebKit 開發 (fork) 一套名為
  • web前端開發面試題一之(html,css)
    DOCTYPE>聲明位於位於HTML文檔中的第一行,處於 <html> 標籤之前。告知瀏覽器的解析器用什麼文檔標準解析這個文檔。DOCTYPE不存在或格式不正確會導致文檔以兼容模式呈現。(2)、標準模式的排版 和JS運作模式都是以該瀏覽器支持的最高標準運行。在兼容模式中,頁面以寬鬆的向後兼容的方式顯示,模擬老式瀏覽器的行為以防止站點無法工作。
  • html是什麼文件,HTML格式的文件怎麼打開?
    html文件結構包括了頭部(Head)、主體部分(Body)。頭部head標籤內是網頁信息,主體body標籤內是網頁要顯示的具體內容。HTML標記/標籤可以有不同的屬性項,用來控制標籤內的內容顯示不同的效果。html文件是文本文件,它需要其他程序(如瀏覽器)的解析。HTML格式的文件用不同的程序打開可能有不同的顯示效果。
  • 網頁性能之html css javascript
    前言html css javascript可以算是前端必須掌握的東西了,但是我們的瀏覽器是怎樣解析這些東西的呢 我們如何處理html css javascript這些東西來讓我們的網頁更加合理,在我這裡做了一些實驗,總結起來給大家看看。
  • 純乾貨:微軟漏洞中國第一人黃正——如何用正確姿勢挖掘瀏覽器漏洞...
    在百度做惡意網頁檢測相關的開發工作,可以說是一個職業「鑑黃師」,其實「鑑黃」是一個非常有挑戰的事情,每天要檢測幾億/幾十億的網頁,怎樣設計存儲、調度、檢測算法,才能在有限的伺服器、帶寬,在有限的時間內檢測完,還要去保證檢出率和誤報率。所以惡意網頁檢測是一個比較偏工程的方向,我呢還是有一顆黑客的心,還挑戰一些新的安全技術方向。
  • html 基礎知識
    </h2>  </body></html>3.2 源碼逐行分析代碼解析<!DOCTYPE html>通知瀏覽器這是一個 HTML5 文檔,應始終寫在第一行<html>...
  • HTML5 遊戲引擎深度測評
    通常我們都會認為它們是遊戲引擎領域兩類不同的產品。原文中提及的引擎確實是當下最為流行的HTML5遊戲引擎。很多引擎屬於2D、3D通吃類型,我們通過一個表格進行對比。程式語言基於HTML5技術的遊戲引擎,所需要的腳本必定是JavaScript,只有JavaScript腳本語言才能運行於瀏覽器中。
  • requests-html:最簡單的爬蟲框架,看完你就會了
    這個工作其實也很簡單,打開你要訪問的網頁,按F12打開開發人員工具,可以看到最左邊有這麼一個按鈕。點擊這個按鈕,然後點擊網頁上你想要查看的網頁元素,然後你就可以發現這個元素對應的相關原始碼已經為你定位完畢了。定位按鈕通過這個功能,我們就可以輕鬆的分析網頁,然後通過它的結構來編寫爬蟲了。
  • 淺談Vue.js中v-text,v-html,{{}}之間的異同
    我記得在以前公司有人這麼說過自己寫css代碼,全程靠猜,例如margin不行改padding,padding不行改定位,這就很能說明問題,對知識點理解不深刻,你不能說他不能做東西,但這樣寫出來的頁面,自然是兼容性差,耦合性過高看下面一段代碼<div id="app">  <p>{{message}}</p>  <p v-html
  • HTML基礎知識學習
    一、目標學習HTML目標,能夠寫出基本的靜態頁面其中需要知道的知識點:(1)需要知道書寫html的工具(2)了解開發使用的瀏覽器以及瀏覽器內核(3)HTML簡介和編寫格式(4)HTML各類標籤以及標籤的關係
  • 遊戲引擎中的渲染管線
    不管是什麼樣的渲染管線,它們的目的都是儘可能地呈現真實世界中的各類材質,從這個目的出發,一幀渲染要完成的任務可以用這張圖比較簡單的解釋:實際上,絕大部分渲染引擎要解決的無非就是直接照明,間接照明和後處理。在現代的實時渲染引擎中,直接照明也往往是管線的核心。
  • Web前端:1、HTML&CSS概述及結構
    用於響應用戶操作01HTML概述全稱:HyperText Markup Language(超文本標記語言),定義頁面內容結構,該語言書寫的代碼通常會被瀏覽器解析執行DOCTYPE html> 文檔聲明定義:它既不是元素,也不是注釋,寫在html代碼的第一行;用來解析元素,通知瀏覽器使用哪一個html版本<html> html元素(又叫根標記),是所有其他元素的祖先元素,最頂層<head> 文檔頭,它是