Qomolangma实现篇(三):兼容层设计
================================================================================
Qomolangma OpenProject v1.0
類別??? :Rich Web Client
關(guān)鍵詞? :JS OOP,JS Framwork, Rich Web Client,RIA,Web Component,
????????? DOM,DTHML,CSS,JavaScript,JScript
項(xiàng)目發(fā)起:aimingoo (aim@263.net)
項(xiàng)目團(tuán)隊(duì):aimingoo, leon(pfzhou@gmail.com)
有貢獻(xiàn)者:JingYu(zjy@cnpack.org)
================================================================================
一、Qomolangma的兼容層設(shè)計(jì)
~~~~~~~~~~~~~~~~~~
自Qomo Field Test3開始,系統(tǒng)從內(nèi)核一層開始提供跨(瀏覽器)平臺(tái)兼容的能力。Qomo試圖
在不同的瀏覽器上提供相同(或類同)的框架層特性。
Qomo 的兼容層設(shè)計(jì)跟常見的其它系統(tǒng)并不一致。基于“Qomo是可拆卸可組裝的”這樣一個(gè)基
本思想,Qomo實(shí)現(xiàn)的兼容層完全可以“象插件一樣增強(qiáng),或者卸載”。
與一般的系統(tǒng)不同,Qomo基本上是基于IE 6的JScript語言特性來提供的兼容層支撐。也就是
說,如果你向Qomo的兼容層添加一個(gè)插件,那么你應(yīng)該致力于“使第三方瀏覽器表現(xiàn)得跟IE6
一致”。而通常的框架可能會(huì)反過來,要求通過兼容層來使得框架表現(xiàn)得跟ECMA-JavaScript
一致。Qomo沒有選擇這樣做,只是因?yàn)镼omo原本就更接近于IE,而非其它。
事實(shí)上,我要說明的是,讓框架兼容IE,比讓IE上的JScript兼容ECMA更難。因?yàn)镴Script提供
了很多ECMA不具備的特性。也就是說,Qomo選擇了這種兼容設(shè)計(jì),意味著實(shí)現(xiàn)一個(gè)更強(qiáng)的Java-
Script環(huán)境。而不是“讓IE的JScript表現(xiàn)起來更象JavaScript”。
Qomo上的兼容層設(shè)計(jì),已經(jīng)使Qomo可以正常地在IE5.0中運(yùn)行了。此外,你會(huì)發(fā)現(xiàn),Qomo已經(jīng)在
以下系統(tǒng)上被測(cè)試,并得到良好的支持:
? - 以Mozilla(Geckco engine)為內(nèi)核的瀏覽器環(huán)境,例如Firefox
? - Mac上的safari
? - Windows平臺(tái)上的IE5.0, IE5.5, IE6.0, IE7.0(beta1&2)
(注: 目前Qomo僅是在JavaScript層面上解決了兼容層問題。對(duì)于DOM,Qomo還沒有展開設(shè)計(jì)。)
二、Qomolangma的兼容層框架
~~~~~~~~~~~~~~~~~~
在Qomo的上一個(gè)Field Test中,兼容代碼和unicode相關(guān)的解碼是放在system.js中的。但后來
Qomo團(tuán)隊(duì)發(fā)現(xiàn)這種設(shè)計(jì)導(dǎo)致system.js結(jié)構(gòu)非常不清晰,移植性也極差。因此,在Field Test3
之后的版本中,兼容層被抽取出來,用獨(dú)立的“兼容層框架”來導(dǎo)入兼容代碼。此外,unicode
相關(guān)的解碼被放置到與具體版本相關(guān)的“兼容代碼”中。
作為一項(xiàng)參考,Qomo的標(biāo)準(zhǔn)設(shè)計(jì)環(huán)境中是這樣:IE 5.5+瀏覽器。在這種環(huán)境下,透過兼容層:
支持:
Geckco engine 1.8.0.1
---------
Mozilla firefox 1.5.0.1以后
? - 沒有unicode解碼特性,因此要求HTML&JS使用UTF-8編碼
? - 使用相對(duì)路徑系統(tǒng)(因?yàn)闉g覽器對(duì)(本地)絕對(duì)路徑做出了嚴(yán)格的安全限制)
Internet Explorer
---------
IE5, 5.5, 6.0及以后
? - 自動(dòng)、智能地支持unicode解碼特性。但對(duì)于IE5.0使用特殊的解碼方案
? - 使用絕對(duì)路徑系統(tǒng),對(duì)路徑/命名空間的識(shí)別和支持更準(zhǔn)確和完善
Qomolangma通過在system.js中導(dǎo)入Compat/CompatLayer.js來裝載兼容性框架。CompatLayer.js
用于實(shí)現(xiàn):
? - 識(shí)別瀏覽器及版本
? - 載入指定版本瀏覽器的兼容代碼
三、Qomolangma如何識(shí)別瀏覽器及版本
~~~~~~~~~~~~~~~~~~
當(dāng)然,大多數(shù)瀏覽器相關(guān)的書籍都要求分析navigator.userAgent字符串來識(shí)別瀏覽器及版本。
但是Qomo沒有(完全)采用這種設(shè)計(jì)。Qomo使用了一種被稱為“Object Sniffing”的、準(zhǔn)確而高
效的技術(shù)來實(shí)現(xiàn)瀏覽器的識(shí)別。在CompatLayer.js頭部的注釋中,你可以看到與之相關(guān)的信息。
但是Object Sniffing還是有力所不逮之處。例如識(shí)別Firefox v1.5.0與v1.5.0.1。這兩個(gè)版本
只修正了一些極細(xì)微的bug。因此Object Sniffing是不能識(shí)別的。這種情況下,Qomo仍然使用
分析userAgent的技術(shù)。為此,Qomo提供了一個(gè)內(nèi)置于CompatLayer.js中的checkit()函數(shù)。你
可以看看這個(gè)有趣的設(shè)計(jì):checkit(v1, v2)返回-1/0/1之一,用于表現(xiàn)v1“小于/等于/大
于”v2。
CompatLayer.js設(shè)計(jì)了一個(gè)checker對(duì)象,它的屬性就是瀏覽器版本標(biāo)識(shí)。例如“ie6、ie5”
之類:
? checker = {
??? ie6 : ie && document.compatMode,
??? ie55 : ie && !this.ie6 && [].push,
??? // ...
? }
而后面的表達(dá)式是檢測(cè)該版本的代碼。
四、Qomolangma中載入指定版本瀏覽器的兼容代碼
~~~~~~~~~~~~~~~~~~
如果checker.<versionTag>條件為真,則一段相應(yīng)的兼容代碼被自動(dòng)載入。這段代碼的文件
名約定為“common_<versionTag>.js”。
一個(gè)低版本的兼容代碼只需要實(shí)現(xiàn)兼容更高版本瀏覽的代碼,最后再載入高版本的兼容層
即可。例如common_ie5.js未尾就載入了common_ie55.js,而后者再載入common_ie6.js。
這樣的設(shè)計(jì),使得ie6的環(huán)境中不需要載入任何“無關(guān)的(非必須的)”兼容代碼。
五、兼容層代碼的特點(diǎn)與問題
~~~~~~~~~~~~~~~~~~
Qomo的兼容層充分地考慮了可擴(kuò)展性。并為后續(xù)代碼中使用這種載入機(jī)制提供了可能:在
可以通過$import.get('browser')來取得瀏覽器版本標(biāo)識(shí)“versionTag”。
Qomo兼容層在IE中實(shí)現(xiàn)到for IE5.0的兼容,但也付出了巨大的犧牲。這包括:
? - common_ie5.js巨大,且實(shí)現(xiàn)不完整
? - 不能使用"<property> in <Object>"語言來檢測(cè)屬性是否存在,因?yàn)镮E5不支持該語法
? - 實(shí)現(xiàn)了IE5中的RegExp的$x屬性和相關(guān)特性(例如支持函數(shù)的String.replace),但效率
??? 較差,因此IE5的unicode解碼只能采用vbs_JoinBytes()。這也使common_ie6.js出現(xiàn)了
??? 冗余設(shè)計(jì)。
Qomo通過對(duì)IE5兼容的研究,提出了在Mozilla(firefox)、Opera、safari等瀏覽器中實(shí)現(xiàn)面
向IE6提供JavaScript兼容特性的通用方法。例如在common_safari.js等中可以看到RegExp的
兼容實(shí)現(xiàn)。
Qomo發(fā)現(xiàn)了一些與瀏覽器版本或內(nèi)核引擎相關(guān)的嚴(yán)重BUG。例如只支持firefox 1.5.0.1以后
版本,并非是Qomo采用了何種特殊的、非ECMA特性的JavaScript語法,而僅僅是因?yàn)榇饲暗?br />Firefox(以及采用早于Geckco 1.8.0.1的Mozilla系列引擎的瀏覽器)存在嚴(yán)重的BUG。
同樣,在兼容層中的一些設(shè)計(jì),例如common_mozold.js和common_safari.js中對(duì)execScript()
的實(shí)現(xiàn)。也僅僅是一些未被修正的瀏覽器BUG導(dǎo)致的代碼開銷。
與此相同的,是在IE5上著名的RegExp.lastIndex BUG,這使得common_ie5.js只能用substr()
去分隔字符串,以實(shí)現(xiàn)RegExp.replace()。——盡管這是低效的根源。
這些問題與Qomo使用怎樣的兼容方案無關(guān)。因此我們只能寄期望于用戶使用更新的、沒有BUG
的瀏覽器。——再或者,忍受bug修補(bǔ)代碼所帶來的效率開銷。:(
轉(zhuǎn)載于:https://www.cnblogs.com/java0818/archive/2006/03/07/2144568.html
總結(jié)
以上是生活随笔為你收集整理的Qomolangma实现篇(三):兼容层设计的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 实现 tomcat 热加载证书
- 下一篇: Activiti5第七弹,自己实现一个P