讀古今文學網 > 編寫高質量代碼:改善JavaScript程序的188個建議 > 第8章 JavaScript引擎與兼容性 >

第8章 JavaScript引擎與兼容性

JavaScript兼容性一直是Web開發中面臨的一個主要問題。在正式規範、實施標準及各種實現之間的現實差異讓很多開發者十分迷茫。這種差異的結果就是很多網頁不能在各種瀏覽器上呈現一致的行為或效果,甚至根本不能跨瀏覽器。

為了實現瀏覽器解析的一致性,首先需要找出不同引擎的分歧點在哪裡。為此,開發人員必須清楚瀏覽器實現的分歧在哪裡,不同JavaScript引擎在哪個地方把規範解讀錯了,或者習慣性定義了哪些怪異的私自標準。本章不僅挖掘IE的JScript解析的歧義,還囊括了來自Firefox、Opera和Safari的JavaScript實現,逐一比較標準的規定和實際的情形。

建議158:比較主流瀏覽器內核解析

瀏覽器可以分為兩部分:外殼(shell)和內核(core),其中外殼的種類相對較多,內核則較少。瀏覽器的外殼包括菜單、工具欄等,主要向用戶提供界面操作、參數設置等。它是調用內核來實現各種功能的。內核才是瀏覽器的核心。內核是基於標記語言顯示內容的程序或模塊。也有一些瀏覽器並不區分外殼和內核。Mozilla在將Gecko獨立出來後,才有了外殼和內核的明確劃分。目前主流的瀏覽器有IE、Firefox、Opera、Safari、Chrome、Netscape等。

瀏覽器內核又可以分成兩部分:渲染引擎和JavaScript引擎。瀏覽器內核負責取得網頁的內容(HTML、XML、圖像等)、整理信息(如加入CSS等),以及計算網頁的顯示方式,然後將結果輸出至顯示器或打印機。由於不同瀏覽器內核對網頁的語法解釋會有不同,因此渲染的效果也不相同。所有網頁瀏覽器、電子郵件客戶端,以及其他需要編輯、顯示網絡內容的應用程序都需要內核。JavaScript引擎則是解析、執行JavaScript語言來實現網頁的動態效果。最開始渲染引擎和JavaScript引擎並沒有明確區分,後來JavaScript引擎越來越獨立,內核就傾向於只指渲染引擎。有一個網頁標準計劃小組製作了一個ACID來測試引擎的兼容性和其他性能。內核的種類很多,包括免費內核大約有十多種,但常見的瀏覽器內核可以分為4種:Trident、Gecko、Presto、Webkit。

❑Trident又稱MSHTML,是微軟公司開發的渲染引擎,包含了JavaScript引擎JScript,它已經深入到Windows操作系統中,如Windows Media Player、Windows Explorer、Outlook Express等都使用它。目前很多瀏覽器都使用這個引擎,如IE、Maxthon(最新版已經不使用)等。

❑Gecko是使用C++語言開發的開源渲染引擎(Mozilla開源項目),包括了SpiderMonkey(Rhino)。主要的使用者有Firefox。

❑Presto是由Opera公司開發、用於Opera的渲染引擎。Macromedia Dreamweaver(MX版本及以上)和Adobe Creative Suite也使用了Presto的內核。

❑Webkit是蘋果公司基於KHTML開發的,包括Webcore和JavaScriptCore(SquirrelFish、V8)兩個引擎。主要的使用者有Safari和Chrome。

下面是主流瀏覽器所使用的內核的簡單分類。

❑Trident內核:IE、Maxthon、騰訊瀏覽器、The World、360、搜狗瀏覽器等。

❑Gecko內核:Netscape 6及以上版本、Firefox、MozillaSuite/SeaMonkey等。

❑Presto內核:Opera 7及以上版本。

❑Webkit內核:Safari、Chrome等。

隨著互聯網十多年的高速發展,近幾年市場上也推出了很多新的瀏覽器,但由於它們採用的並不是自主開發的內核,所以瀏覽器內核本身沒有實質上的突破。下面對主流瀏覽器內核的優缺點進行比較。

❑Trident:這種瀏覽器內核是IE使用的內核,因為在早期IE佔有大量的市場份額,所以這種內核比較流行,以前有很多網頁都是根據這個內核的標準來編寫的。實際上這個內核對真正的網頁標準支持得不是很好,甚至在2005年,與網頁標準制定組織(W3C)所制定的標準發生了脫節。同時Trident內核本身的Bug比較多,對一些符合W3C標準的網頁代碼支持得不是很好,這在早期的IE版本中比較明顯。微軟公司從IE 9版本開始全面升級了IE內核,使其完全符合標準設計要求。

❑Gecko:這是Firefox和Flock所採用的內核,這個內核的優點就是功能強大、豐富,可以支持很多複雜網頁效果和瀏覽器擴展接口,但會消耗很多的資源,如內存。

❑Presto:這是Opera採用的內核。Presto內核被公認為目前瀏覽網頁速度最快的內核,這得益於它在開發時的優勢,在處理JavaScript等腳本語言時,會比其他的內核快3倍左右,缺點就是為了達到很快的速度而丟掉了一部分網頁兼容性。

❑Webkit:這是Safari採用的內核,屬於蘋果系統下的瀏覽器。優點是網頁瀏覽速度較快,雖然不及Presto但也勝於Gecko和Trident;缺點是對於網頁代碼的容錯性不高,也就是說,對網頁代碼的兼容性較低,會使一些編寫不標準的網頁無法正確顯示。

不同JavaScript引擎在解析相同JavaScript代碼時的實現邏輯和算法可能存在分歧,當然運行的結果也會不同,最明顯的就是DOM實現部分。常用JavaScript引擎說明見表8.1。