所謂的“瀏覽器內(nèi)核”無(wú)非指的是一個(gè)瀏覽器最核心的部分——“Rendering
Engine”偏竟,直譯這個(gè)詞匯叫做“渲染引擎”迫靖,不過(guò)我們也常稱其為“排版引擎”征堪、“解釋引擎”嚎莉。這個(gè)引擎的作用是幫助瀏覽器來(lái)渲染網(wǎng)頁(yè)的內(nèi)容,將頁(yè)面內(nèi)容和排版代碼轉(zhuǎn)換為用戶所見(jiàn)的視圖桌硫。
注:有時(shí)候我們所說(shuō)的“瀏覽器內(nèi)核”甚至“渲染引擎”夭咬,其實(shí)除了渲染引擎,也悄悄包含了javascript引擎铆隘,如WebKit卓舵,它由渲染引擎WebCore和javascript引擎JSCore組成。
常見(jiàn)的瀏覽器內(nèi)核(或者說(shuō)渲染引擎)有很多個(gè)膀钠,如Trident掏湾、Gecko裹虫、WebKit等等,不同的內(nèi)核對(duì)網(wǎng)頁(yè)編寫(xiě)語(yǔ)法的解釋也有不同忘巧,進(jìn)而導(dǎo)致同一個(gè)頁(yè)面在不同內(nèi)核的瀏覽器下顯示出來(lái)的效果也會(huì)有所出入恒界,這也是前端工程師需要讓作品兼容各種瀏覽器的原因。
我們常常喜歡把瀏覽器內(nèi)核與某瀏覽器名稱直接掛鉤起來(lái)砚嘴,如IE內(nèi)核十酣、Chrome內(nèi)核,其實(shí)是不全面的說(shuō)法际长。比如Opera在7.0版本到12.16版本中采用的是獨(dú)立研發(fā)的Presto引擎耸采,但在后續(xù)跟隨了Chrome的腳步加入了WebKit大本營(yíng),放棄了Presto工育;另外即使名稱相同虾宇,但版本不同的引擎也可能存在較大差別。比如IE6使用的是Trident早期版本如绸,存在許多bug嘱朽,性能也較低。而最新的IE11所使用的Trident7.0版本已經(jīng)可以支持WebGL(3D繪圖標(biāo)準(zhǔn))以及HTML5大部分標(biāo)準(zhǔn)怔接。
下面按照各個(gè)主流瀏覽器搪泳,介紹下它們所使用的瀏覽器內(nèi)核的歷程。
Internet?Explorer:
IE開(kāi)發(fā)計(jì)劃開(kāi)始于1994年夏天扼脐,微軟為抵抗當(dāng)時(shí)主流的網(wǎng)景Netscape
Navigator岸军,要在Windows中開(kāi)發(fā)適合自己的瀏覽器,但微軟并沒(méi)有時(shí)間從零開(kāi)始瓦侮。因此和Spyglass合作艰赞,于是IE從早期一款商業(yè)性的專利網(wǎng)頁(yè)瀏覽器Spyglass
Mosaic派生出來(lái)忿项,雖然Spyglass Mosaic與NCSA Mosaic(首款應(yīng)用得最廣泛的網(wǎng)頁(yè)瀏覽器)甚為相似懈叹,但Spyglass
Mosaic則相對(duì)地較不出名并使用了NCSA Mosaic少量的源代碼。
1996年拌屏,微軟通過(guò)給予季度費(fèi)用和部分收入從Spyglass中取得了Spyglass
Mosaic的源代碼和授權(quán)罚攀。從而使IE逐漸成為微軟專屬軟件吁断。它采用的排版引擎(俗稱內(nèi)核)為T(mén)rident。每一次新的IE版本發(fā)布坞生,也標(biāo)志著Trident內(nèi)核版本號(hào)的提升。
下面是各Trident版本信息:
冷知識(shí):除Trident之外掷伙,微軟還有另一個(gè)網(wǎng)頁(yè)瀏覽器排版引擎是己,稱為T(mén)asman,它是使用在「Internet Explorer for
Mac」的排版引擎任柜。相較于Trident卒废,Tasman引擎對(duì)網(wǎng)頁(yè)標(biāo)準(zhǔn)有較佳的支持沛厨,但微軟自04年開(kāi)始已經(jīng)停止了Mac計(jì)算機(jī)版本的
Internet Explorer的開(kāi)發(fā)。
Safari
Safari是蘋(píng)果公司開(kāi)發(fā)的瀏覽器摔认,使用了KDE(Linux桌面系統(tǒng))的KHTML作為瀏覽器的運(yùn)算核心逆皮,Safari所用瀏覽器內(nèi)核的名稱是大名鼎鼎的WebKit。?Safari在2003年1月7日首度發(fā)行測(cè)試版参袱,并成為Mac?OS?X?v10.3與之后版本的默認(rèn)瀏覽器电谣,也成為蘋(píng)果其它系列產(chǎn)品的指定瀏覽器(也已支持Windows平臺(tái))。
如上述可知抹蚀,WebKit前身是KDE小組的KHTML引擎剿牺,可以說(shuō)WebKit是KHTML的一個(gè)開(kāi)源的分支。當(dāng)年蘋(píng)果在比較了Gecko和KHTML后环壤,選擇了后者來(lái)做引擎開(kāi)發(fā)晒来,是因?yàn)镵HTML擁有清晰的源碼結(jié)構(gòu)和極快的渲染速度。
需要了解的是郑现,雖然我們稱WebKit為瀏覽器內(nèi)核(或?yàn)g覽器引擎)湃崩,但不太適合直接稱之為我們開(kāi)頭提到的Rendering?Engine(渲染引擎),因?yàn)閃ebKit本身主要是由兩個(gè)引擎構(gòu)成的接箫,一個(gè)正是渲染引擎“WebCore”攒读,另一個(gè)則是javascript解釋引擎“JSCore”,它們均是從KDE的渲染引擎KHTML及javascript解釋引擎KJS衍生而來(lái)列牺。
在2010年4月整陌,蘋(píng)果公司宣布了其瀏覽器引擎Webkit的最新項(xiàng)目?Webkit2。Webkit2的目標(biāo)是實(shí)現(xiàn)獨(dú)立進(jìn)程與非阻斷式API瞎领。
WebKit可以說(shuō)是蘋(píng)果公司給開(kāi)源世界的一大貢獻(xiàn)泌辫,基于此開(kāi)源引擎,衍生了多個(gè)WebKit分支九默,如下面要介紹的Chrome的瀏覽器引擎震放。
Chrome?/?Chromium
谷歌Chrome/Chromium瀏覽器從08年創(chuàng)始至今一直使用蘋(píng)果公司的WebKit作為瀏覽器內(nèi)核原型,是WebKit的一個(gè)分支驼修,我們可以稱之為Chromium引擎(注意我們這里說(shuō)的是Chromium引擎殿遂,而不是Chromium瀏覽器)。
這里順便介紹下Chrome和Chromium兩個(gè)瀏覽器的區(qū)別——Chromium瀏覽器是谷歌為發(fā)展自家的瀏覽器Chrome而開(kāi)啟的計(jì)劃乙各,所以Chromium相當(dāng)于Chrome的工程版或稱實(shí)驗(yàn)版(盡管Chrome自身也有β版階段)墨礁,新功能會(huì)率先在Chromium上實(shí)現(xiàn),待驗(yàn)證后才會(huì)應(yīng)用在Chrome上耳峦。Chromium一天最多可以更新十幾二十個(gè)版本恩静,實(shí)驗(yàn)性的新特性都會(huì)現(xiàn)在這里放出,但是Chromium本身其實(shí)并不穩(wěn)定;而Chrome總共有四個(gè)更新分支:Canary驶乾、Dev邑飒、Beta、Stable级乐,穩(wěn)定性依次增強(qiáng)疙咸。
我們說(shuō)回引擎。Chromium引擎雖然是屬于WebKit的分支风科,卻把WebKit的代碼梳理得可讀性提高很多撒轮,所以以前可能需要一天進(jìn)行編譯的代碼,現(xiàn)在只要兩個(gè)小時(shí)就能搞定丐重。因此Chromium引擎和其它基于WebKit的引擎所渲染頁(yè)面的效果也是有出入的腔召。基于以上原因扮惦,有的地方會(huì)把Chromium引擎跟WebKit區(qū)分開(kāi)來(lái)臀蛛,有的地方則直接把Chromium引擎歸為WebKit(比如維基百科),其實(shí)都有其道理崖蜜。
然而在13年發(fā)布的Chrome?28.0.1469.0版本開(kāi)始浊仆,Chrome放棄Chromium引擎轉(zhuǎn)而使用最新的Blink引擎(基于WebKit2——蘋(píng)果公司于2010年推出的新的WebKit引擎),Blink對(duì)比上一代的引擎精簡(jiǎn)了代碼豫领、改善了DOM框架抡柿,也提升了安全性。
Opera
Opera瀏覽器等恐,是一款挪威Opera?Software?ASA公司制作的支持多頁(yè)面標(biāo)簽式瀏覽的網(wǎng)絡(luò)瀏覽器洲劣。是跨平臺(tái)瀏覽器可以在Windows、Mac和Linux三個(gè)操作系統(tǒng)平臺(tái)上運(yùn)行课蔬。Opera瀏覽器創(chuàng)始于1995年4月囱稽,到2014年3月4日,官方發(fā)布的個(gè)人電腦用的最新版本為Opera20二跋。
Opera的一個(gè)里程碑作品是Opera7.0战惊,因?yàn)樗褂昧薕pera?Software自主開(kāi)發(fā)的Presto渲染引擎,取代了舊版Opera?4至6版本使用的Elektra排版引擎扎即。
Presto加入了動(dòng)態(tài)功能吞获,例如網(wǎng)頁(yè)或其部分可隨著DOM及Script語(yǔ)法的事件而重新排版。Presto在推出后不斷有更新版本推出谚鄙,使不少錯(cuò)誤得以修正各拷,以及閱讀Javascript效能得以最佳化,并成為當(dāng)時(shí)速度最快的引擎闷营。
然而為了減少研發(fā)成本烤黍,Opera在2013年2月宣布放棄Presto,轉(zhuǎn)而跟隨Chrome使用WebKit分支的Chromium引擎作為自家瀏覽器核心引擎。
在Chrome與2013年推出Blink引擎(也是基于WebKit的分支)之后蚊荣,Opera也緊跟其腳步表示將轉(zhuǎn)而使用Blink作為瀏覽器核心引擎。
Firefox
Mozilla?Firefox是一個(gè)開(kāi)源網(wǎng)頁(yè)瀏覽器莫杈,原名是Firebird互例,2004年2月9日,Mozilla?Firebird決定改稱Mozilla?Firefox筝闹。Firefox瀏覽器使用的是Gecko內(nèi)核媳叨,其發(fā)展歷程如下:
1997年,網(wǎng)景收購(gòu)了DigitalStyle关顷。當(dāng)時(shí)糊秆,網(wǎng)景瀏覽器在各方面的表現(xiàn)已經(jīng)比不上她的主要競(jìng)爭(zhēng)對(duì)手Internet?Explorer。網(wǎng)景開(kāi)始研發(fā)下一代的排版引擎议双,并期望把新的排版引擎應(yīng)用于下一版本的網(wǎng)景瀏覽器上痘番。
1998年初,Mozilla計(jì)劃開(kāi)始執(zhí)行平痰。這個(gè)新的排版引擎名為Raptor汞舱,以開(kāi)發(fā)源碼的方式發(fā)放于互聯(lián)網(wǎng)上。后來(lái)宗雇,因?yàn)樯虡?biāo)問(wèn)題昂芜,Raptor改名為NGLayout(即next?generation?layout之意)。而最后NGLayout就被網(wǎng)景重新命名為Gecko赔蒲。
2003年7月15日時(shí)代華納解散了網(wǎng)景公司泌神,大部分開(kāi)發(fā)者被解雇。Mozilla基金會(huì)亦在當(dāng)天成立舞虱,繼續(xù)推動(dòng)著Gecko的發(fā)展欢际。時(shí)至今天,Gecko仍繼續(xù)由Mozilla的雇員和義工所維護(hù)和發(fā)展砾嫉。
最后還是再談?wù)刯avascript引擎(后面統(tǒng)稱JS引擎)這東西幼苛。我們上述的渲染引擎主要是負(fù)責(zé)HTML、CSS以及其他一些東西的渲染焕刮,而JS引擎則主要負(fù)責(zé)對(duì)javascript的渲染舶沿,一個(gè)JS引擎的好壞決定了一個(gè)瀏覽器對(duì)腳本的加載和執(zhí)行速度,也影響了其跑分配并。
下方列出各種主流瀏覽器各自的JS引擎括荡,了解下即可:
Firefox:
SpiderMonkey:第一款JavaScript引擎,由Brendan?Eich在Netscape?Communications時(shí)編寫(xiě)溉旋,用于Mozilla?Firefox?1.0~3.0版本畸冲。
Rhino:由Mozilla基金會(huì)管理,開(kāi)放源代碼,完全以Java編寫(xiě)邑闲。
TraceMonkey:基于實(shí)時(shí)編譯的引擎算行,其中部份代碼取自Tamarin引擎,用于Mozilla?Firefox?3.5~3.6版本苫耸。
JaegerMonkey:德文J?ger原意為獵人州邢,結(jié)合追蹤和組合碼技術(shù)大幅提高性能,部分技術(shù)借鑿了V8褪子、JavaScriptCore量淌、WebKit:用于Mozilla?Firefox?4.0以上版本。
IonMonkey:可以對(duì)JavaScript編譯后的結(jié)果進(jìn)行優(yōu)化嫌褪,用于Mozilla?Firefox?18.0以上版本呀枢。
OdinMonkey:可以對(duì)asm.js進(jìn)行優(yōu)化,用于Mozilla?Firefox?22.0以上版本笼痛。
Chrome:
V8:開(kāi)源裙秋,由Google丹麥開(kāi)發(fā),是Google?Chrome的一部分晃痴。
注:我們上面提到Chrome是基于WebKit的分支残吩,而WebKit又由渲染引擎“WebCore”和JS解釋引擎“JSCore”組成,可能會(huì)讓你搞不清V8和JSCore的關(guān)系倘核。你可以這樣理解——WebKit是一塊主板泣侮,JSCore是一塊可拆卸的內(nèi)存條,谷歌實(shí)際上認(rèn)為Webkit中的JSCore不夠好紧唱,才自己搞了一個(gè)V8?JS引擎活尊,這就是Chrome比Safari在某些JS測(cè)試中效率更高的原因。
IE:
Chakra:中文譯名為查克拉漏益,用于Internet?Explorer?9的32位版本及IE10+蛹锰。
Opera:
Linear?A:用于Opera?4.0~6.1版本。
Linear?B:用于Opera?7.0~9.2版本绰疤。
Futhark:用于Opera?9.5~10.2版本铜犬。
Carakan:由Opera軟件公司編寫(xiě),自O(shè)pera10.50版本開(kāi)始使用轻庆。
其它:
KJS:KDE的ECMAScript/JavaScript引擎癣猾,最初由Harri?Porten開(kāi)發(fā),用于KDE項(xiàng)目的Konqueror網(wǎng)頁(yè)瀏覽器中余爆。
Narcissus:開(kāi)放源代碼纷宇,由Brendan?Eich編寫(xiě)(他也參與編寫(xiě)了第一個(gè)SpiderMonkey)。
Tamarin:由Adobe?Labs編寫(xiě)蛾方,F(xiàn)lash?Player?9所使用的引擎像捶。
Nitro(原名SquirrelFish):為Safari?4編寫(xiě)上陕。