(開寫前來波硬廣:

https://

weolar。github。io/minibl

ink/

我的史上最小巧的chromium核心控制元件新鮮出爐,10幾M大小,純C介面,幾行程式碼就能整合到軟體裡。目前僅支援windows。)

大家這幾天,想必都被紅芯瀏覽器刷屏了,這貨:

從紅芯事件聊聊瀏覽器核心 (一)

從紅芯事件聊聊瀏覽器核心 (一)

號稱世界第5個自主核心、中國首款,難道做個瀏覽器核心真有這麼簡單嗎?

正巧我多年一直在收集各種瀏覽器的資料和趣聞,就讓我們來看下瀏覽器核心到底是什麼,以及難度如何。

說起瀏覽器,就得從當年IE大戰網景說起。

在it界的洪荒年代(1992年),人們在網際網路上還是隻能看黑白螢幕上一行又一行的字元的時候,伊利諾斯州大學(NCSA)的馬克·安德森 就突發奇想的搞出一個名為Mosaic的瀏覽器,可以顯示圖文資訊。在放到網上免費傳播後,大家紛紛對這種互動方式非常感興趣。但他們意識到,無論Mosaic瀏覽器多麼受歡迎,它終究只是一個學校的產物。令兩人不爽的是,他們無法說服伊利諾斯州大學轉讓 Mosaic瀏覽器。安德森最終決定重新編寫一個瀏覽器,在大家的努力下,一個新的付費瀏覽器又出來了,它就是Navigator,而公司的名字就是 Netscape,1994年成立。

Netspace 上市不久,Microsoft就釋出了人們期望已久的新作業系統Windows 95,同時還有瀏覽器Internet Explore 1。0。

IE的功能那時很辣雞,不支援Java,不支援外掛,速度也很慢。其實這時候的IE1。0,還是從NCSA Mosaic瀏覽器為基礎改造而來,它的釋出時間是1995年8月份。同年11月,微軟心急火燎地推出2。0版本。

也就是說,當年的IE和Netspace ,來源都是當年的Mosaic。

有意思的是,多年後,微軟NT4和win2k的程式碼洩漏了,裡面正好包含IE2和IE5。5的程式碼。於是2011的某一天,我也突發奇想的把這兩貨從微軟洩漏程式碼里扣了出來,並費了老大一肚子勁編譯了出來,程式碼見:

https://

bbs。pediy。com/thread-13

7616。htm

IE2的程式碼相對好編譯一點,需要補上缺少的一堆標頭檔案,以及個別實現不完整的補充,並在理解架構的基礎上,把一些小bug改掉。

從紅芯事件聊聊瀏覽器核心 (一)

上個IE2的圖。

IE2就是不帶當年微軟trident排版引擎的、據說改自Mosaic的上古瀏覽器,此時css都還沒發明,和現在的瀏覽器差距極其巨大。

不過IE2並不是說沒用,至少我把這玩意移植到了我的介面庫,並且成為了一個牛逼無比的richedit了,嘿嘿…

其實IE2的結構非常清晰,扣出來的過程很有意思。IE2就一個函式,用來顯示所有的gif、文字。另外有幾個函式負責解析html。

當年我扣出來後,做了一個文字顯示控制元件,非常爽,哈哈。文字的選擇等邏輯也很完整,而且很容易讀懂,因為是純C打造。

SGML_write 把html解析到_w3doc裡後,調個TW_Draw就把所有內容包括影象都顯示出來了。

時間線來到IE6的時代。在此期間,發生了一件重大的事情,就是CSS也被髮明出來了。據

https://www。

zhihu。com/question/2905

64335/answer/472165753#comment-503954538

裡的描述,發明CSS的人叫 Haakon Wium Lie,是Opera 的CTO。

有意思的是,另一款瀏覽器核心webkit的前身,KHTML,來自Trolltech 公司的QT專案。KHTML和Opera 都是挪威的公司,兩家基本是上下樓的關係,而且部分程式碼是共享的,所以我不得不懷疑當年兩家是同時開始擼瀏覽器核心的,然後因為某些原因開始分道揚鑣。

所以也可以看到,現在流行的五大核心(Opera 、blink、webkit、firfox、IE),其中三家都是源自當年的挪威派系,甚至很多CSS標準,可能都是專門為Opera 而設計再提出成為標準的。

話說回到IE6。這可是當年一個劃時代的瀏覽器。雖然在今天被人黑出翔了,但這也側面說說明當年IE6有多牛逼,時至今日還在發揮餘溫。

IE6以及前身IE5。5當年提出了許多今天看來非常黑科技的東西。比如:

1,提出XMLHttpRequest,被谷歌發掘後成了風靡全球的AJAX。

2,提出VML,向量渲染語言,繪製各種炫酷向量圖不在話下。

3,提出濾鏡功能,能給網頁實現各種炫酷效果。其實大家經常見到的word裡的百葉窗什麼的動畫,就是濾鏡功能。而且有意思的是,word裡的此功能,和IE是共用同個模組的,我還嘗試過在我自己的程式裡直接呼叫COM介面來實現同樣的炫酷效果。

4,提出HTA的概念,可以直接把html變成本地應用。和現在的hybrid app、PWA之流是不是很像?

5,各種先進的CSS排版功能。

正是這麼多神奇和強大的功能,讓IE6在推出後,打爆了老對手Netscape(當然,微軟也是用了不少猥瑣手段,例如和360一樣的捆綁安裝)。微軟從此一家獨霸瀏覽器市場,以至於10年時間整個瀏覽器部門都沒事情可以做,然後被解散了…可能當時微軟認為天下已經掌握手中,瀏覽器基本沒什麼可發展了吧。

想重溫IE5。5\IE6的人,可以在剛才我的帖子裡下載。當年我被IE震驚之餘,也嘗試從win2k洩漏程式碼里扣出IE部分。最後在我擼到一半的時候,發現另外一個豌豆莢的哥們已經擼出來了,他把IE5。5的程式碼整理成了他的一個介面庫(據說萬兄敲這個程式碼的時候敲的肩膀都出問題了,也是很拼):

從紅芯事件聊聊瀏覽器核心 (一)

從紅芯事件聊聊瀏覽器核心 (一)

從紅芯事件聊聊瀏覽器核心 (一)

從紅芯事件聊聊瀏覽器核心 (一)

從紅芯事件聊聊瀏覽器核心 (一)

萬兄整理的基於IE程式碼介面庫,不但有基礎的div+css功能,還支援activex控制元件,支援介面的Filter特效。不過vml不支援,我估計vml的程式碼這個IE5。5版本還沒開發出來。

這個版本的IE架構我之前寫了幾篇文章,本來發在百度空間上,結果百度空間倒閉了,文章也不見了…

憑一點點殘存的印象,我記得這個版本程式碼寫的有點難懂。說混亂倒不至於,裡面各種類的劃分很清晰的,只是可能是從DOS時代走出來的老程式設計師的習慣,程式碼裡的變數、函式名什麼的,很多是簡寫,看起來有累,要時刻回憶pPbsz之類的變數具體啥意思。

從紅芯事件聊聊瀏覽器核心 (一)

估計微軟要找我麻煩,畢竟是洩漏程式碼

不過這注釋寫的還是挺完善的。

有意思的是,曾經在前端界大名鼎鼎的IE hasLayout問題,可以在這個程式碼裡找到問題的成因。

從紅芯事件聊聊瀏覽器核心 (一)

估計微軟要找我麻煩,畢竟是洩漏程式碼

從紅芯事件聊聊瀏覽器核心 (一)

haslayout的註釋

透過程式碼可以看出,haslayout是element的一個成員變數,用來減少排版的計算。感興趣的人可以仔細讀下haslayout的具體邏輯。

這個版本的IE架構有個小小問題,沒有把排版和渲染獨立出來,都混合在同一套資料結構裡(而之後的webkit,就區分成Node、RenderObject),而且也沒做跨平臺準備,全都使用的windows的資料結構,如HDC。不知道後來IE實現跨平臺到MAC上是不是要做吐血。

話說IE6出了N年之後,谷歌站出來打臉了。谷歌本來是主推Firfox的(也就是Netscape交給開源社群後,重整後涅槃重生的全新瀏覽器),但谷歌一直在集中巨大資金研發自己的開源瀏覽器:chrome。果然,2008年,chrome一經面世,立刻震撼了世人,當然也包括我。預知後事如何,且看下回分解。