什么樣的瀏覽器內核,才敢說是“自主研發”?
宣稱國內“自主研發”的紅芯瀏覽器,在宣布獲得 C 輪 2.5 億投資之后,被大家所關注。微博用戶 @Touko 在將其安裝包加壓后發現,所謂的自主研發,不過是將 Chrome 瀏覽器進行了一次 “換膚” 處理。
紅芯瀏覽器當天晚上就將官網上下載渠道給關閉了,理由是技術部門自查,后續發公告承認內部使用 Chrome 內核,在開源的 Chrome 內核的基礎之上,進行二次開發。
***“紅芯公司”也就此次事件進行道歉,稱其夸大的自主研發,并承認確實是在開源的 Chromium 之上進行的二次開發,算是塵埃落定了。
不過話說回來,在技術領域如何才能被大家承認是瀏覽器內核的“自主研發”?讓我們借此機會,回顧一下瀏覽器內核的發展歷史。
什么是瀏覽器內核
首先應該弄清楚,瀏覽器的構成。
簡單來說,瀏覽器可以分為兩個部分:Shell 和內核。Shell 就是指的瀏覽器的外殼,例如:菜單、工具欄等為瀏覽器提供便捷的用戶可操作界面、參數配置等等。Shell 其實都是很豐富的,國內的大部分瀏覽器,其實就是拿現有的內核,定制不同的 Shell,而一些有能力的會在內核之上做一些定制化的修改。
對于瀏覽器而言,內核才是它的核心。瀏覽器內核也可以被分為兩部分:
- 渲染引擎(Rendering Engine)
- JS引擎(JS Engine)
渲染引擎主要負責將網頁內的元素(HTML、CSS、圖像)等渲染成它對應的樣子,輸出至顯示器或打印機。而不同的瀏覽器,渲染的效果是有差異的,這就是為什么前端工程師要對不同的瀏覽器進行適配的原因。
JS 引擎則是解析 JavaScript 語言,執行 JavaScript 來實現網頁的動態效果和邏輯。
最初渲染引擎和 JS 引擎并沒有區分的很清晰,而后來 JS 引擎越來越獨立,后期說到瀏覽器內核就是單純的指渲染引擎。
除了一些小眾的非商用的免費內核,比較常見的瀏覽器內核可以分為四種:Trident、Gecko、Blink、WebKit。接下來我們分別介紹他們。
Trident(IE 內核)
Trident 的前身是微軟的 Mosaic(歷史上***款瀏覽器),Trident 就是在 Mosaic 代碼的基礎之上修改而來,對外輸出的產品就是微軟的 IE,所以它也被稱為 “IE 內核”。
Trident 一款開放的瀏覽器內核,在當初來看,其內核設計的相當成熟,而它又作為 Windows 的系統內置瀏覽器,使得 Trident 在很長的一段時間內一家獨大。導致有點膨脹,這直接導致兩個后果。
- 與 W3C 標準嚴重脫節,這也是為什么前端工程師抵觸做適配 IE 這件事情。
- 本身存在了大量 Bug 以及安全性的問題,沒有被重視和得到解決。
IE 的膨脹也致使很多用戶轉向了其他瀏覽器,Firefox 和 Opera 就是在那個時間段崛起的。當選擇不再單一的時候,許多開發人員也就開始注意網頁標準和非 IE 瀏覽器的渲染效果問題。
說到 IE 瀏覽器,再說點冷知識,IE 在 Mac OS 下在版本「Internet Explorer for Mac」,其內核使用的并非 Trident 內核,而是 Tasman 內核。與 Trident 相比,Tasman 內核對網頁標準,有更好的支持。這個事情知道一下就好了。
IE 瀏覽器從開始的膨脹到現在的開放態度、擁抱標準,這一路走來,其實是經歷了很多次大的改動,例如 IE8 的 JS 引擎是 JScript,IE9 則開始使用 Chakra,這兩個版本區別很大,Chakra 無論在速度和標準方面都很出色,IE9 算是一個大版本的改動,之下已經形成斷層,這也是為什么很火的前端框架 VUE 也只敢對 IE 說兼容到 IE9+。
Trident 在國內的使用還是占很大的市場的,大部分所謂的雙核瀏覽器,其中一核指的正是 Trident ,就是所謂的“兼容模式”。
Gecko (Firefox內核)
Gecko 原本是網景瀏覽器(Netscape)所采用的內核,后來 Mozilla Firefox(火狐瀏覽器)也采用了該內核。并且在使用 Gecko 內核的瀏覽器當中,因為 Firefox 的市場占有率***,有時也會將它稱為 Firefox 內核。
Gecko 引擎和 IE 也有一些淵源,正是因為 IE 的膨脹,也導致了微軟內部一些開發人員對其不滿,他們選擇離開微軟和當時已經停止更新的 Netscape 團隊中的一些成員,一起創建了 Mozilla。以當時的 Mosaic 內核為基礎重新編寫內核,這才有了后來的 Gecko。而 Gecko 又是完全開源的,因此可開發的程度很高,導致大量的程序員在其之上編寫代碼、增加功能,當時出現了一大批以 Gecko 為內核的瀏覽器,但是只有 Firefox 被大家記住了。
WebKit(Safari內核)
WebKit 的前身是 KDE 小組的 KHTML,WebKit 所包含的 WebCore(渲染引擎)和 JSCore 引擎來自 KDE 的 KHTML 和 KJS。
當年 Apple 公司比較了 Gecko 和 KHTML 后,選擇了 WebKit,因為它擁有更清晰的源碼結構和極快的渲染速度。Apple 將 KHTML 發揚光大,推出了以 KHTML 為基礎的改進型 WebKit 引擎,并使用在自己的瀏覽器 Safari 之上。
雖然 WebKit 的鼻祖是 Safari,但是很多時候我們提到它就會聯想到 Chrome,其實早年間 Chrome 確實使用的是 WebKit 內核,它將 WebKit 內核深入人心了,后面我們再詳細介紹。
Chromium/Blink(Chrome 內核)
Google 在 2008 年發布了 Chrome 瀏覽器,使用的內核被命名為 Chromium。
Chromium 在 WebKit 的基礎上將代碼進行重構,大大的提高了編譯的速度,因此渲染引擎渲染的頁面效果也與 WebKit 有一些出入。正是因為有此淵源,所以一些地方會將 Chromium 和 WebKit 放在一起討論,而另外一些地方將他們區分開來講,其實都是有一定道理的。
之后 Google (丹麥)還自己研發了 V8 引擎,用于 JS 的解析和執行,這就是后來 Node.js 的運行環境。Google 將 V8 引擎替換到原本 WebKit 的 JSCore,為 Chrome 帶來了更快的 JavaScript 運算速度。
Chromium 雖然是 Fork 自 WebKit,但是其實他們是兩個項目,又因為 Google 和 Apple 兩家公司本身在很多領域存在競爭關系,雙方也并沒有想將瀏覽器方向上的技術完全共享。雙方各自發展,最終由于 Apple 推出的 WebKit2 與 Google 的 Chromium 的沙箱設計存在沖突,導致強行合入會增加復雜性,索性 Google 就決定從 WebKit 中衍生出自己的 Blink 引擎。
說到底,都是基于 WebKit 切出來的子分支代碼,獨立開發了一段時間后,***發現差異太大,導致代碼合回去成本太高,索性各自獨立發展。
Blink 引擎后期已經由 Google 和 Opera Software 共同研發,它在 WebKit 代碼的基礎上研發出更加快速和簡約的渲染引擎,并逐步脫離 WebKit 的影響。據說為此 Blink 刪除了 880w 行 WebKit 的代碼,最終發展出一個獨立的瀏覽器內核。
前面講到國內雙核瀏覽器中,其中一核使用 IE 的 Trident,將其定義為 “兼容模式”,而另外一核基本上使用的都是 Chromium,被稱為“極速模式”。
再說說移動端
移動端的瀏覽器內核,主要說的是系統內置瀏覽器內核。
前面提到的四個內核,均在移動端上有對應的產品。而針對平臺來說,iOS 平臺主要是 WebKit,Android 4.4 之前的瀏覽器內核是 WebKit,而 Android 4.4 之后切換到 Chromium/Blink。
騰訊推出的 X5 內核,實際上就是基于 WebKit 內核進行的二次開發,并且處于一種假“雙內核”模式,在 WebKit 內核加載失敗的情況下,會使用原生的 Blink 內核。X5 內核被用在騰訊旗下的產品上,例如:微信、QQ,一定程度上解決了它自身 Android、iOS 兩個版本的渲染差異,以及 Android 版本碎片導致內核版本差異出現的渲染差異。
內核發展圖譜
Trident 和 Gecko 都還算是比較單純,就是從一個版本一直開發,增加功能。
而 WebKit 就相對來說,有更多的關系糾纏在里面。
在這個圖中,其實并沒有體現出內核的升級和變遷,和一些細節的替換,其實每一次迭代都伴隨這大量的代碼投入、功能改動和優化。此圖只是為了大家對 WebKit 的發展有一個了解。
在上圖中,是將渲染引擎和 JS 引擎單獨區分開,其實也是為了說明發展的歷程。在文章的開頭也說了,現在談到瀏覽器內核,一般都是在泛指渲染引擎內核。所以 Apple 開發的 WebKit 其實就是 KED 小組開發的 (KHTML,KJS) 的分支(WebCore,JSCore)。而 Google 實際上認為 WebKit 中的 JSCore 有一些不足的地方,所以才自己搞了一個 V8 JS 引擎,這就是為什么 Chrome 敢說比 Safari 在某些 JS 效率的測試中,表現更好的原因,基本上也是看到了 JSCore 的不足,在巨人的肩膀上做更好的優化。
瀏覽器現狀
以國內的瀏覽器現狀來說,大部分公司出的瀏覽器無外乎這幾個瀏覽器內核的組合,所謂的雙核或多核瀏覽器,通常都是 Trident 配合 WebKit 或者 Blink,在其中做二次開發,并且可以在多核之間進行切換,以適應不同的場景。
360 瀏覽器算是國內比較早投入到瀏覽器市場的產品,據 360 發表的題為《中國為什么沒有自主研發的瀏覽器內核?》一文中提到,Google 在研發 Chromium 的時候,投入了最少 30億美元的研發成本以及上百億的推廣成本。而國內,沒有同等實力的公司去投入這樣的研發和推廣資金,去打造自主研發的瀏覽器內核。
此外,今天 Chromium 和 Gecko(Firefox)本身就是一個開源項目,產品由社區共制,從授權協議上看,它們也鼓勵基于已有技術去做技術創新,而不是重復的發明輪子。所以準守開源標準去做一個瀏覽器并不可恥,強如 Chromium 本身也是基于大量的開源項目累計起來,才有了現在的體量和市場,這就是開源的力量。比起開源項目被美國人控制,更應該擔心的是標準本身缺少話語權。畢竟瀏覽器的每一行代碼,都要受 W3C、CABForum 組織,RFC 協議規范。內核引擎里每一行代碼,都要受到對應的行業標準所約束。
看了瀏覽器內核的發展歷史,你應該知道為什么 Google 在 WebKit 基礎之上研發的 Blink 沒人詬病,而國內紅芯內核所謂的 “自主研發” 到***就是一個笑話了吧。
《主流瀏覽器介紹》:http://web.jobbole.com/84826/
《各主流瀏覽器內核介紹》:http://www.cnblogs.com/vajoy/p/3735553.html
百度百科-X5內核:https://baike.baidu.com/item/X5%E5%86%85%E6%A0%B8/14083554
維基百科。
【本文為51CTO專欄作者“張旸”的原創稿件,轉載請通過微信公眾號聯系作者獲取授權】