怎樣自行開發一個Webkit內核的瀏覽器?

這個問題可能在各位知友看來有一點「圖樣圖森破」,但是我是認真的,真心求問。


首先更正下上面幾位對於WebKit的寫法,請正確的書寫WebKit,K是大寫,而不是webkit,

看了這個題目,我想,題主應該是有2方面的意思:

  1. 如何開發一個WebKit內核
  2. 如何基於Webkit內核來開發一款瀏覽器

如何開發一個WebKit內核

是否有必要自己開發一個WebKit內核

看過前面幾位的回答,應該都是做過基於Webkit或者Chromium開發的。在我個人看來,是否有必要自己開發一個WebKit。這種必要性不能一概而論。如果說,你是想開發一個跟現有的WebKit或者Blink內核功能一樣的渲染引擎內核,我也認為沒有必要。

開發一個支持現有的W3C標準特性以及快速合成渲染的WebKit引擎,人力和技術成本非常高,WebKit任何一個看似理所當然的功能點,都非常複雜。

舉個例子,在大家看來,點擊一個HTML的&標籤鏈接打開一個新頁面,看起來非常理所當然的一件事情,在WebKit內核裡面,卻做了非常多的事情,首先,要獲取當前點擊的位置,帶著這個位置坐標信息,去做一個HitTest。所謂的HitTest就是探測下當前的點擊的內容是什麼,怎麼才能知道當前點擊的是什麼呢?HitTest會遍歷整個DomTree, LayerTree,看看當前的坐標位置是什麼內容,是空白?還是文字?還是圖片,還是鏈接?這些信息都可以通過遍歷DomTree, LayerTree來實現,最終將遍歷的探測結果以HitTestResult的形式返回,最終通過返回的類型來判斷,如果是一個鏈接,則回調對應的回調函數,最終實現通過點擊打開一個新的頁面。

那麼這些輪子,已經被WebKit和Blink工程師都做好了,而且都是開源的,拿過來編譯下,即可應用到自己的產品中,或者自己進行學習和研究。

那麼,既然WebKit和Chromium都已經做的這麼好了,是不是就真的沒有必要自己開發一個內核呢?我個人認為,有必要,但是要結合自己的產品和應用場景。

這就好像很多人說,有了Linux, Android,所有的設備都可以不用重新開發OS了,直接把Linux和Android移植過來使用就可以了,但是要知道,目前我們身邊很多熟悉的設備,還真的不是什麼Linux或者Android,比如很多穿戴設備,智能手錶,智能眼鏡兒等等,很多系統甚至都不是使用C來開發的,而是直接使用的彙編。

我想這正是開源慣出來的毛病。但凡有人提到說想開發一個WebKit內核引擎,大家都把WebKit和Blink搬出來說,不要自己開發了,用開源的WebKit或者Blink就可以了。Blink的確很強大,渲染速度,而且非常通用。但是Blink的強大是有代價的,他對硬體CPU,GPU以及內存的要求略高,那麼對於小眾的特定瀏覽場景,這種開銷反而會帶來更大的性能損耗。使用了Blink 1%的功能,但是卻引來了幾十M甚至上百M的內存消耗,適得其反。

我最早開始接觸WebKit的時候,是多年前,在搜狐開發MeeGo版本的搜狐微博,當時的MeeGo使用的是Qt來開發的,微博大家知道,最麻煩的是圖文混排,既要速度快,又要很靈活方便,當時使用Qt開發,使用了多種方案,效果都不理想,後來發現QtWebKit(WebKit port for Qt)來實現圖文混排卻非常方便,而且效果好。只需要圖文混排的場景,應該說功能非常單一,但是引入QtWebKit的後果就是,微博滑動以及點擊詳情頁卡頓,new WebView之後,什麼也不做,5M內存沒了,5M內存,這對於很多年前的MeeGo來說,已經是非常多了,而且這個5M內存還有泄漏,delete掉WebView之後,還身下2M的WebCore佔用的內存始終無法使用。

在後面幾年深入了解WebKit原理之後,才知道WebCore的確有很多內存,無法釋放,除非退出應用。所以說,對於特定的應用場景,完全沒必要將Blink直接搬過來使用,看似滿足你的部分需求,但是卻達不到你要的效果。這個時候,就非常適合自己動手開發一個極小的急速類WebKit內核。據我所知,目前國內就有幾個知名的App,因為不滿Blink的性能,而自己招團隊開發了一個tiny WebKit,一個非常輕量而且速度非常快的類WebKit內核,用於滿足自己的產品業務需求。

如何開發WebKit內核?

回答這問題,我想,還是從需求出發,WebKit所有的功能,總結也就這麼幾大塊

  1. 資源調度與下載
  2. 資源解析
  3. 資源合成
  4. 渲染
  5. 事件處理

那麼,首先要搞清楚,你的使用場景是否屬於HTML的W3C標準的子集。最好是使用W3C標準的子集再加上自己的定製需求,這樣開發一個類WebKit內核還有現有的產品和技術進行參考。查看Blink的源碼那麼,首先要搞清楚,你的使用場景是否屬於HTML是否屬於W3C的標準的子集。最好是使用W3C標準的子集再加上自己的定製需求。

查看Blink的源碼,你會發現Google的工程師,為了做到通用性,把上面的每一個步驟都寫的非常複雜,那麼自己來實現的時候,就沒有必要了。資源下載的部分,Blink使用的自己實現的Chromium_net,其實也沒有必要使用這個大的類庫,使用比較輕量及的curl等網路庫來實現,就夠了。

另外就是解析,如果是自己實現WebKit內核,肯定是解析自己約定的特定HTML規則(W3C的子集+定製),甚至於說,完全可以直接在服務端進行解析,將結果傳遞給客戶端來合成渲染即可,這樣一來WebKit的功能更加輕量簡潔。

如何開發基於WebKit內核的瀏覽器?

基於WebKit內核開發瀏覽器,在幾年前Chromium將內核獨立出來的時候,所有的移動設備上的瀏覽器,都是基於WebKit的。曾經也出現過非WebKit的瀏覽器,但是隨著WebKit的流行,也都放棄了自己的內核,轉向基於WebKit/Blink來開發瀏覽器,我們所熟知的UC瀏覽器,騰訊瀏覽器等等就是這樣的。

基於WebKit來開發瀏覽器,對於目前的設備來說,基本已經是不可能了,因為你所接觸到的系統,都提供了自己的系統的內核,Android上,早些年是WebKit,後來也變成Chromium WebView了。所以說,與其說是基於WebKit內核開發瀏覽器,倒不如說是基於系統的WebView API來開發瀏覽器。從這個層面來講,只要學習下系統WebView的API,即可開發自己的瀏覽器,無非是UI和功能進行設計下,難度不是很大,無非是人力投入設計和開發。

但是遺憾的是,現在目前的Android移動設備上,已經很難找到一款輕便,體積小的瀏覽器了。一方面瀏覽器廠商為了做到在不同的系統版本之間的通用性,另一方面是各大手機廠商都會對系統WebView進行改動導致不兼容,導致瀏覽器廠商不願意使用系統自帶的內核,不惜花非大量的資源,將WebKit或者Blink封裝到自己的瀏覽器裡面,對於高端手機來說,瀏覽體驗還好,但是對於中低端機器來講,首先安裝包至少是會增加10M以上,瀏覽體驗卡頓。

題外話,當Blink的出現,導致Blink內核的封裝成本越來越低,所以WebKit或者瀏覽器工程師,越來越不吃香,這可以從目前互聯網公司招WebKit/瀏覽器工程師的價位可以看出來,好幾年前,我收到過獵頭給北京某知名遊戲公司找WebKit工程師,價位非常高。而這麼多年來,再也沒見開這麼高的瀏覽器工程師職位了。

好了,寫了這麼多,如果有講的不對的地方,歡迎跟我一起進行討論。我自己多年從事WebKit, Chromium,V8以及Nodejs底層開發,目前是半路出家做偽前端。非常歡迎跟大家一起做技術交流。

歡迎微信搜索公眾號「 三旬叔的工坊 」或者掃碼關注我的個人微信公眾號,我會不定期的更新技術產品相關的原創文章。

http://weixin.qq.com/r/TkQUDKTEs-nMreBv9xFc (二維碼自動識別)


謝邀。

這年頭應該極少有人從webkit開始擼一個瀏覽器了。最靠譜的做法就是直接用chromium的開源代碼,編譯完了就是個完整的瀏覽器了。

如果你硬要用webkit開始也不是不可以,但webkit只是個內核,還缺了很多周邊的設施,比如外殼ui、收藏夾、插件擴展、密碼管理器,硬碟緩存、網路加速……等一堆東西。而且webkit現在不怎麼搞windows port了。你要從webkit開頭,做一個完整的瀏覽器,我覺得是沒有可能的。一個人精力太有限了。

所以一切看你擼這個東西到底是想幹啥。如果你只是想學習瀏覽器的話直接chromium吧,如果真是想自己造輪子,也還是要chromium……畢竟你弄明白chromium,才好知道輪子怎麼造。


在互聯網上找了一下關鍵字

然後出來的比較靠譜的鏈接。

  1. 探索WebKit內核(一)------ 菜鳥起步

  2. 第1篇:.NET多種WebKit內核/Blink內核瀏覽器初步測評報告

你可能還需要的是自己動手找一些相關的東西。

友情幫答。


如果要自己寫一個Webkit一樣的內核是幾乎不可能。

但是如果你想寫個簡單的可以運行跑起來的內核,比如只能渲染一個網頁(html的部分標準,和執行JavaScript)這個其實問題不大。完全可以。而且我之前就有做過類似這樣的事情

補充下,實際上完全可以開發出來 部分兼容webkit內核的小內核


WebEngine Widgets Simple Browser Example

這個可以參考一下基於chromium的


我也是來學習的,也考慮開發一款瀏覽器支持產品數據的定製化瀏覽。


技術儲備不行的和時間不允許的,建議不要去碰瀏覽器內核。

開發一款瀏覽器,是商業行為呢還是個人興趣呢?如果感興趣可以去學習、把玩。

要玩WebKit,首先就要把WebKit那些庫理清楚(幹什麼用,怎麼用,最好自己移植或封裝一個出來)、很多概念性的東西(DOM、render、window/frame/View等等--深入代碼)要搞清楚。當這些都弄明白了,技術實力肯定提升好大一個台階。因為瀏覽器本身就是一個「亞操作系統」。


似乎挑戰難度太高了吧!


[self.view addSubview:[WKWebview new]];


推薦閱讀:

為什麼edge老是卡死?
為什麼只有瀏覽器(或JS)是有所謂的同源策略?
Chrome 真的很費電嗎?
豆瓣的回應按鈕為何不加以美化,而直接使用瀏覽器默認樣式?
Chrome 瀏覽器的名字有什麼來歷?

TAG:GoogleChrome | 網頁瀏覽器 | WebKit | 瀏覽器內核 |