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