瀏覽器內核及渲染模式的介紹


     首先要引入一個概念——排版引擎(Layout Engine,Rendering Engine),就是經常上網的人也許都聽說過的瀏覽器內核,負責解析網頁語法(如HTML、JavaScript)並渲染、展示網頁各品牌瀏覽器的內核是不同的,不同的內核處理同一段代碼的時候思路不同。因此可以說,瀏覽器間內核的差異是產生兼容性問題的根本原因。這就是我們苦逼前端工程師們經常希望瀏覽器大一統的原因了。當然這只是個夢,那好我們回歸現實,下面我將對四種常用的瀏覽器內核進行簡單的介紹。

      Trident

      Trident(IE內核):該內核程序在1997年的IE4中首次被采用,是微軟在Mosaic代碼的基礎之上修改而來的,並沿用到IE11,也被普遍稱作”IE內核”。Trident實際上是一款開放的內核,其接口內核設計的相當成熟,因此才有許多采用IE內核而非IE的瀏覽器(殼瀏覽器)涌現。由於IE本身的“壟斷性”而使得Trident內核的長期一家獨大,微軟很長時間都並沒有更新Trident內核,這導致了兩個后果——一是Trident內核曾經幾乎與W3C標准脫節(2005年),二是Trident內核的大量 Bug等安全性問題沒有得到及時解決,然后加上一些致力於開源的開發者和一些學者們公開自己認為IE瀏覽器不安全的觀點,也有很多用戶轉向了其他瀏覽器,Firefox和Opera就是這個時候興起的。非Trident內核瀏覽器的市場占有率大幅提高也致使許多網頁開發人員開始注意網頁標准和非IE瀏覽器的瀏覽效果問題。國內大部分瀏覽器(比如360)都是“雙核”甚至是“多核”,其中一個內核是Trident,然后再增加一個其他內核。國內的廠商一般把其他內核叫做“高速瀏覽模式”,而Trident則是“兼容瀏覽模式”,用戶可以來回切換。(補充:IE從版本11開始,初步支持WebGL技術。IE8的JavaScript引擎是Jscript,IE9開始用Chakra,這兩個版本區別很大,Chakra無論是速度和標准化方面都很出色。)

       Gecko

       Gecko(Firefox內核):Netscape6開始采用的內核,后來的Mozilla FireFox(火狐瀏覽器) 也采用了該內核,Gecko的特點是代碼完全公開,因此,其可開發程度很高,全世界的程序員都可以為其編寫代碼,增加功能。因為這是個開源內核,因此受到許多人的青睞,Gecko內核的瀏覽器也很多,這也是Gecko內核雖然年輕但市場占有率能夠迅速提高的重要原因。
 
      Presto

      Presto是一個由Opera Software開發的瀏覽器排版引擎,目前Opera 7.0~10.00版本使用該款引擎。Presto的特點就是渲染速度的優化達到了極致,它是目前公認的網頁瀏覽速度最快的瀏覽器內核,然而代價是犧牲了網頁的兼容性。

      Presto 實際上是一個動態內核,與Trident、Gecko等內核的最大區別就在於腳本處理上,Presto有着天生的優勢,頁面的全部或者部分 都能夠在回應腳本事件時等情況下被重新解析。此外該內核在執行JavaScript時有着最快的速度,根據同等條件下的測試,Presto內核執行同等 JavaScript所需的時間僅有Trident和Gecko內核的約1/3。不過,不足之處在於Presto是商業引擎,使用Presto的除了 Opera以外,只剩下NDS Browser、Nokia 770網絡瀏覽器等,這在很大程度上限制了Presto的發展。 Opera Widget引擎采用的就是Presto引擎。

      Webkit

      Webkit(Safari內核,Chrome內核原型,開源):它是蘋果公司自己的內核,也是蘋果的Safari瀏覽器使用的內核。 Webkit引擎包含WebCore排版引擎及JavaScriptCore解析引擎,均是從KDE的KHTML及KJS引擎衍生而來,它們都是自由軟件,在GPL條約下授權,同時支持BSD系統的開發。所以Webkit也是自由軟件,同時開放源代碼。在安全方面不受IE、Firefox的制約,所以Safari瀏覽器在國內還是很安全的。
      限於Mac OS X的使用不廣泛和Safari瀏覽器曾經只是Mac OS X的專屬瀏覽器,這個內核本身應該說市場范圍並不大;但似乎根據最新的瀏覽器調查表明,該瀏覽器的市場甚至已經超過了Opera的Presto了——當然這一方面得益於蘋果轉到x86架構之后的人氣暴漲,另外也是因為Safari 3終於推出了Windows版的緣故吧。Mac下還有OmniWeb、Shiira等人氣很高的瀏覽器。
       Google Chrome、360極速瀏覽器以及搜狗瀏覽器高速模式也使用webkit作為內核(在腳本理解方面,Chrome使用自己研發的V8引擎)。WebKit 內核在手機上的應用也十分廣泛,例如 Google 的手機 Gphone、 Apple 的iPhone, Nokia’s Series 60 browser 等所使用的 Browser 內核引擎,都是基於 WebKit。
 
        下面將引入另一個概念,瀏覽器的工作模式也稱為“渲染模式”。實際上瀏覽器不同的工作模式不僅對渲染有影響,對代碼的解析以及腳本的行為也同樣有影響。
所以說內核相同,渲染模式不同也會產生兼容性的問題。讓我們來看看渲染模式的產生來源:         

       微軟於 2001 年 8 月 27 日發布的 IE6(Internet Explorer 6)增強了對 CSS1 的兼容,這使得 IE6 對 CSS 的解析及渲染與它的前一個版本 IE5.5 有了很大的差別,如對盒模型的理解、表格尺寸的算法等。

       為了保持良好的向后兼容性,微軟為用戶提供了一個“開關”,來決定瀏覽器的工作模式,這個“開關”就是頁面頂部的 DTD。
       某些 DTD 將使 IE6 工作在“標准兼容模式”(即“標准模式”),這種模式使用了 IE6 最新的處理方式,包括對 CSS1 的兼容及一些 DHTML 方面的增強。
而另一些 DTD,包括不設置 DTD 將使 IE6 工作在“向后兼容模式”(即“混雜模式”),這種模式對頁面的處理是與 IE5.5 保持一致的,這樣就可以保證對一些在 IE5.5 中表現良好的頁面在 IE6 中也能達到同樣的效果。
      微軟在后續推出的 IE7、IE8 中,也使用了上述“開關”,與 IE6 一樣,在 IE7、IE8 的“混雜模式”下,對頁面處理方式仍與 IE5.5 一致。因此可以說,IE 系列的“混雜模式”,將瀏覽器的行為凍結在了 IE5.5 這個版本,雖然 IE 各版本的混雜模式也略有區別,但它們的本意都是向后兼容。

      隨着時間的推進和標准的進步,IE6、IE7 的“標准模式”逐漸已經變得不夠標准了,2009年3月19日發布的 IE8 重新定義了“標准模式”,再次增強了對標准規范的支持,同時為了保持對 IE7 的兼容,IE8 增加了一種工作模式:“接近標准模式”。於是,IE8 的工作模式就分成了三種:“標准模式”、“接近標准模式”和“混雜模式”。

      目前所有主流瀏覽器對於向后兼容問題的處理都與 IE 系列一樣,提供了不同的模式來保證向后兼容。

      瀏覽器的工作模式就是在這種背景下誕生的,它很好的解決了瀏覽器對標准支持上的不斷增強及對一些錯誤的修復而導致的向后兼容問題,但也將瀏覽器在不同情況下的表現及行為變得更加復雜多樣。

      通過以上的內容,我們可以得出結論:如果一個頁面能使各瀏覽器都工作在“標准模式”下,那么各瀏覽器都將盡量兼容標准,因此各瀏覽器之間表現出的差異是很少的。相反,如果一個頁面使各瀏覽器都工作在“混雜模式”下,那么各瀏覽器都將盡量向后兼容,因此各瀏覽器之間表現出的差異將會最大化。

附錄: 一些常見的 doctype
      
        在編寫一個頁面時,要使用可以觸發各瀏覽器“標准模式”的DTD,並書寫符合規范的代碼,以保證您的頁面在各瀏覽器中可以最大程度的兼容。相信大家看了這些會對瀏覽器的兼容性有更深刻的了解,最起碼知道那些萬惡bug的來源了。


免責聲明!

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



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