本身動手實現瀏覽器,21天自制chromium:起手篇

轉:https://zhuanlan.zhihu.com/p/29101613?utm_medium=social&utm_source=qqjavascript

你們好,我又來了。這篇是21天自制原子彈的姐妹篇。css

開個玩笑……從這篇開始, 咱們來點乾貨,如何從blink打造一個能夠實用的瀏覽器組件。java

 

chromium從零幾年搞到如今,已經徹底變成一個無所不包的龐然大物。node

若是你只是想要一個能瀏覽網頁的組件,方便嵌入到本身的程序裏,或者想用網頁來作界面--例如QQ音樂,網易雲音樂那樣,c++

那麼chromium的那堆多進程、mojo通訊、Chrome Apps 框架、Aura Shell、增量升級系統、Chrome Extensions 、headless模式、P2P 通訊庫,native_client、pdf、ppapi、沙盒機制等等一堆亂七八糟你聽都沒聽過的東西都不會須要。程序員

然而只要用了chromium的內核(例如cef,elecTron,nwjs之類),這堆東西除了佔用系統資源外,你還不得不都打包帶上。web

這時候你就會有個強烈的想法,我不須要這堆亂七八糟的功能,只要能瀏覽大部分網頁的排版渲染組件能夠麼。api

答案是確定的。瀏覽器

webkit內核就是爲此而生。但這裏有個問題,chromium雖然當年是使用webkit內核,但自從和蘋果分道揚鑣後,把webkit更名成blink不說,代碼和結構徹底是面目全非,並且最重要的是blink已經不是像webkit那樣是一個獨立的組件了,而是chromium那堆幾百個第三方庫裏一個小小的組件,全部外部設施都依賴於chromium的其餘組件了。網絡

咱們來看看blink目前須要依賴哪些組件:

  1. cc層(chromium 合成層,實現網頁繪製並貼到屏幕上等操做。這個是最麻煩的,之後專門開一篇來說如何自制)
  2. base庫(chromium基礎庫,相似字符串操做等一系列c++基礎庫)
  3. 各類和操做系統打交道的接口,例如菜單、文件讀寫、窗口操做等。這堆東西能夠認爲是要實現third_party/WebKit/public/platform/Platform.h裏的一系列虛函數(又叫Blink Public或者WebKit Glue)。
  4. 若是你不是打算賣到清真地區,一般icu你也不會想要。這是個佔用體積很大的毒瘤,一個數據文件就10幾M,做爲輕量級內核,你確定不想帶。
  5. 網絡層。
  6. v8(js引擎)
  7. skia(底層繪圖庫)

 

 

 

那咱們如何在儘可能少的使用chromium代碼基礎上,實現上訴一堆功能和組件呢?

這是目前個人解決方案:

  1. cc層:我放棄了原版chromium cc層,本身徹底重寫了一遍。這個工做量至關巨大,若是你不是和我同樣這麼閒,建議直接使用原版cc。
  2. base庫:在chromium四十幾版的時候,blink幾乎不依賴base。然而高版本把wtf庫裏的大量實現,直接使用base庫。因此若是你是從高版本blink開始擼,能夠直接扣取低版本blink裏的wtf來實現base相關依賴。此處工做量也甚大。
  3. 各類和操做系統打交道的接口:這塊其實沒有難度,就是有着巨大的工做量。一個個補齊就好。
  4. icu:直接使用系統相關的接口。例如文字編碼轉換之類的,windouws就有現成的api。其餘高級icu api例如斷行斷句,若是你只打算運行在中英文地區,那本身實現也很簡單。只有阿拉伯文、天成文、藏文這些小衆語言那須要那麼複雜的規則。
  5. 網絡層:直接用webkit裏的現成代碼吧。
  6. v8:直接使用chromium原始代碼便可。畢竟這玩意不依賴其餘任何組件。
  7. skia:直接使用chromium原始代碼便可。畢竟這玩意不依賴其餘任何組件。

說到這裏,你們確定有個疑問:既然這麼多都用webkit,那爲啥咱們直接拿webkit過來不就好了。

實際上是能夠的。webkit發展到今天,已經徹底和chromium分開發展了(當年有一陣子谷歌的人也一直在給webkit提代碼,後面蘋果把他們都踢走了)。並且webkit就是個完整內核,你用來作輕量級組件正合適。但我有幾個緣由仍是放棄了:

  1. webkit對標準的支持仍是有點誤差。例如web組件標準,css gird等等。
  2. webkit的web inspect作的很爛,徹底沒blink好用。
  3. webkit如今也很大了,我編譯出來不算icu,也有26M多。做爲一個有追求的程序員,我但願這個大小是10M左右。
  4. 最重要的,webkit的js引擎是javascriptcore。這樣實現的組件就沒法兼容市面上那堆v8造出來的輪子。例如electron、nwjs、nodejs都是用v8。
  5. 還有個小點就是chromium更新很是快,跟着谷歌大佬走感受更有保障些,尤爲是碰到各類莫名其妙的bug,還能夠查chromium的更新記錄。

既然放棄了webkit,從chomium開始擼,那必然會遇到噸的傷害。欲知後事如何,且聽下回分解

相關文章
相關標籤/搜索