? ? ? 談到WebKit负乡,我覺得還是挺有緣分的榜田。本人在大學(xué)其實是做Java開發(fā)益兄,然而大學(xué)畢業(yè)后的第一份工作卻是做了基于WebKit的瀏覽器。剛接觸WebKit的時候箭券,感覺代碼實在太龐大净捅,不知如何下手,不過在我組長的幫助下辩块,還是慢慢開始嚼動了這塊硬骨頭蛔六。
? ? ? ?剛開始的時候荆永,你會覺得WebKit就是一塊難啃的硬骨頭,但是當(dāng)你真正理解了一些知識之后国章,你會發(fā)現(xiàn)屁魏,它是一個有框架的老骨頭,它除了搭建自身的框架捉腥,還將其他開源代碼都組合起來。所以你画,看WebKit代碼抵碟,一定不能鉆進代碼里了,那樣你就苦逼的撓頭發(fā)吧(當(dāng)然不排除大牛)坏匪。經(jīng)過這兩年的研究拟逮,發(fā)現(xiàn)要想快速掌握WebKit,一定要先弄懂框架适滓。廢話不多說敦迄,上圖!凭迹!
? ? ? 請原諒我網(wǎng)上隨便扒圖罚屋,哈哈,不過這幅圖確實很到位嗅绸!照著這個架構(gòu)圖去認識WebKit脾猛,你會很快就上手!WebKit代碼主要分WebKit對外API鱼鸠、WebCore猛拴、JSCore和WTF,這些模塊在目錄結(jié)構(gòu)上也非常明朗蚀狰,大家看WebKit源代碼目錄結(jié)構(gòu)就能一目了然愉昆。
? ? ? ?WebKit對外API主要就是封裝了一些基本接口,供應(yīng)用層調(diào)用麻蹋。我們在瀏覽器上經(jīng)常會使用一些基本的功能跛溉,比如加載網(wǎng)頁、刷新哥蔚、返回上一頁倒谷、收藏、處理按鍵鼠標事件等等糙箍。這些功能都是調(diào)用WebKit對外API實現(xiàn)的渤愁。當(dāng)然,具體功能實現(xiàn)肯定不在WebKit對外API層深夯,它只是負責(zé)封裝抖格。
? ? ? ?WebCore模塊是WebKit的關(guān)鍵诺苹,它主要負責(zé)渲染整個頁面,也就是我們看到的頁面整體的面貌都是由它完成的雹拄。它里面主要分為以下子模塊:
? ? ? ?Page:提供對外的總?cè)肟谝约绊撁嫦嚓P(guān)的Chrome收奔、Setting、History等模塊滓玖;
? ? ? ?Document:解析html/xml/svg坪哄,生成DOM樹的子系統(tǒng);
? ? ? ?CSS:負責(zé)CSS的解析和匹配势篡;
? ? ? ?Render:實現(xiàn)Layout和Render過程的子系統(tǒng)
? ? ? ?Graphics:封裝底層圖形庫翩肌,對上提供一套平臺無關(guān)的繪制接口;
? ? ? ?Network:封裝底層網(wǎng)絡(luò)庫禁悠,對上提供一套與平臺無關(guān)的網(wǎng)絡(luò)加載接口念祭;
? ? ? ?Loader:負責(zé)網(wǎng)絡(luò)IO、Form Submission碍侦、Memory Cache等粱坤;
? ? ? ?Script:提供JS執(zhí)行入口以及從C++對象到JS對象轉(zhuǎn)換的Binding和Bridge;
? ? ? ?Extension Modules:實現(xiàn)非DOM的HTML5擴展JS功能模塊瓷产,如Worker站玄、WebSocket、WebStorage拦英、FileAPI等蜒什,可能需要相應(yīng)的Custom Binding代碼;
? ? ? ?Plugin:用于加載NPAPI插件疤估,需要Bridge模塊完成和JS引擎的互動灾常;
? ? ? ?Editing:負責(zé)輸入框文字編輯;
? ? ? ?Inspector:負責(zé)調(diào)試頁面铃拇,也就是瀏覽器吵伲看見的“審查元素”之后彈出來的調(diào)試界面,具體實現(xiàn)需自己開發(fā)慷荔;
? ? ? ?JSCore模塊主要負責(zé)JS腳本的執(zhí)行雕什,WebKit默認采用JavascriptCore引擎,Android采用了V8显晶。相比V8和JavascriptCore贷岸,網(wǎng)上有很多資料介紹其不同點,本人對這塊研究也不是很深磷雇,之前編譯兩個引擎偿警,執(zhí)行同一份js代碼做過對比,執(zhí)行效率差別并不是很大唯笙,感興趣的朋友可以研究一下螟蒸,分享一下個人經(jīng)驗盒使。
? ? ? ?WTF模塊全稱Web Template Library,作為WebKit的主要基礎(chǔ)庫七嫌,它優(yōu)雅的實現(xiàn)了智能指針少办、字符串操作、容器操作诵原,提供了跨平臺的原子操作英妓、時間封裝、線程封裝绍赛、以及高效的內(nèi)存管理手段鞋拟。WebKit的WebCore模塊大量使用了WTF庫的代碼,學(xué)懂了這一模塊惹资,看WebCore代碼會事半功倍。
? ? ? ?簡單的介紹完了各個模塊一些基礎(chǔ)知識航闺,對于剛接觸WebKit的朋友是不是還是一頭霧水褪测。之所以先介紹這些模塊是想告訴大家,以后看代碼或者調(diào)試潦刃,遇到相關(guān)問題可以直接在這個模塊里加打印或者打斷點侮措。先把各個模塊弄清楚了,然后慢慢把所有模塊組織在一起乖杠。這樣學(xué)習(xí)起來就輕松加愉快了分扎。