最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JS前端框架關(guān)于重構(gòu)的失敗經(jīng)驗(yàn)分享

 更新時(shí)間:2013年03月17日 10:54:22   投稿:whsnow  
關(guān)于重構(gòu)JS前端框架的失敗經(jīng)驗(yàn)接下來(lái)與大家分享一下,感興趣的你可不要錯(cuò)過(guò)了哈,畢竟是經(jīng)驗(yàn)之談哈

好了開始吧
重構(gòu)這個(gè)其實(shí)也不是什么大動(dòng)作,主要要實(shí)現(xiàn)的功能嘛,就是把現(xiàn)有的JS代碼重新劃分一下,解耦現(xiàn)有模塊。然后我打算把現(xiàn)有的程序劃分一下模塊然后重新打包做一個(gè)命名空間實(shí)現(xiàn)use或者類似于java的Package的東西。那么我只要加載一個(gè)use的js文件調(diào)用這個(gè)文件的use函數(shù),通過(guò)設(shè)置某些參數(shù),我可以動(dòng)態(tài)地加載所需要的模塊。這個(gè)是最完美的想法(那時(shí)我很傻很天真)。好的,噩夢(mèng)開始了。
前提,我低估了3個(gè)月前的自己。//好吧,下面可能會(huì)出現(xiàn)un文明用語(yǔ)~~

首先,計(jì)劃的第一天,我的打算是分離這個(gè)程序里面最需要解耦的部分,控件部分。說(shuō)起來(lái),人家也嘗試著寫了一些窗體控件什么的比如Panel.js,Button.js之類的控件這里面有一大堆js文件,雖然我已經(jīng)劃分好文件夾了,但是看到index頁(yè)面上面那一連串的<script>標(biāo)簽,各種的說(shuō)。于是噩夢(mèng)進(jìn)入第二階段,我想加載一個(gè)JS文件,而這個(gè)JS文件可以動(dòng)態(tài)地加載所有的控件JS。如果想了解"動(dòng)態(tài)加載JS"的相關(guān)知識(shí),請(qǐng)去度娘G娘那里問(wèn)個(gè)明白。我想應(yīng)該會(huì)搜到好多3異步+1Ajax的實(shí)現(xiàn)。好了,這些都是廢話,參考了《高性能JavaScript》一書,產(chǎn)生以下代碼:

復(fù)制代碼 代碼如下:

function loadScript (url, callback){
var script = document.createElement("script");
script.type = "text/javascript";
if(script.readyState){ //IE
script.onreadystatechange = function(){
if(script.readyState == "loaded" || script.readState == "complete"){
script.onreadystatechange = null;
callback();
}
}
}else{
script.onload = function(){
callback();
}
}
script.src = url;
document.getElementsByTagName("head")[0].appendChild(script);
}

好的悲劇慢慢開始,首先我的控件都是基于JQuery的那么必然要 loadScript(jqueryURL, function(){//加載我的控件s}),好的這里說(shuō)到這里打斷一下,下面再接上。
然后我又突發(fā)奇想要做命名空間的功能,好的研究了面向?qū)ο蟀?,原型鏈啊之類雜七雜八的東西然后發(fā)現(xiàn)這種打點(diǎn)引用的功能好抽象,給那本《javascript設(shè)計(jì)模式》的書忽悠的七零八落。最后在了解了原型模式之后,還是一團(tuán)迷霧。好的,我覺(jué)得我要重新思考這個(gè)問(wèn)題,我其實(shí)只是想要打點(diǎn)出控件而已,那么我只要將我的控件作為一個(gè)對(duì)象的屬性綁定到一個(gè)全局的對(duì)象上面就好了。于是我用了自己的英文名Gssl作為一個(gè)對(duì)象得出如下結(jié)構(gòu):
復(fù)制代碼 代碼如下:

var Gssl = {}

好了回到上面打斷的地方,我的想法就是在動(dòng)態(tài)加載JS的時(shí)候順便構(gòu)造我的全局對(duì)象并綁定到空間名為Gssl下,具體實(shí)現(xiàn)如下:
復(fù)制代碼 代碼如下:

loadScript(jqueryURL, function(){
//加載我的控件s
loadScript(controlURL, function(){
//綁定控件
Gssl.control = control;
});
});

寫到這里,測(cè)試是調(diào)通了,昨天晚上,小開心了一下,但是程序員的直覺(jué)話我知,噩夢(mèng)還沒(méi)有結(jié)束。
今天早上回去把這個(gè)動(dòng)態(tài)加載JS的JS文件引用到了我的頁(yè)面那里,結(jié)果因?yàn)楫惒降奶攸c(diǎn),后面的代碼沒(méi)有等到這個(gè)Gssl的對(duì)象生成完成就開始執(zhí)行了(我去,這不合理?。H缓笏伎剂艘幌拢朐谧詈蠹虞d的一個(gè)控件那里做一個(gè)ready標(biāo)志位以標(biāo)志Gssl到底有沒(méi)有加載完成。但是發(fā)現(xiàn)每個(gè)組件各自有各自的callback函數(shù),你根本就不知道哪一個(gè)才是最后加載的,雖然代碼執(zhí)行是有順序的,但是這個(gè)傳輸?shù)牟⑿行杂肿屇悴荒艽_定到底哪一個(gè)才是最后一個(gè)。好的我徹底崩潰了,于是想了一個(gè)非常2B的方法,干脆寫一個(gè)函數(shù)來(lái)卡住程序2秒吧,兩秒肯定可以了~。然后發(fā)現(xiàn)setTimeout TM不能卡代碼的,他的好友setIXXXXX也是不能卡代碼的。好的,朕生氣了,寫了一個(gè)死循環(huán)循環(huán)判斷ready位。好的,瀏覽器不干了。

回到原點(diǎn),我開始考慮嘗試遞歸式的加載就是在Callback的時(shí)候才去加載下一個(gè)控件,這樣我就能知道控件什么時(shí)候加載完了。但是仔細(xì)一想,我擦,如果要這樣加載那么我還動(dòng)態(tài)加載個(gè)屁啊,這不就一點(diǎn)也沒(méi)有提高到效率么。然后看了各種框架的ready方法的實(shí)現(xiàn)。嗯 TM單文件的就是IMBA啊。那么擺在我面前的就只有一條路了,把所有的控件都寫在一個(gè)JS上面。這樣根本就是避重就輕啊。

然后我就不斷在這種提出解決方案,然后不斷自我吐槽中度過(guò)了噩夢(mèng)般的一天??煜掳嗔耍疫€在不停地思考這個(gè)問(wèn)題究竟有沒(méi)有解。然后腦里面第三個(gè)聲音開始了,志偉啊~(呵呵本人的名字就是這個(gè)了~),真的有必要么?好的,不得不承認(rèn),每次脫離噩夢(mèng)就得靠他。然后我把整個(gè)項(xiàng)目的文件夾打開每層每層地點(diǎn)開又退回去,然后思考,好吧,不是寫小說(shuō),這些思考時(shí)候的小動(dòng)作就不描述了(我會(huì)告訴你我想問(wèn)題的時(shí)候會(huì)好像精神病人一樣犯傻么)。最后我發(fā)現(xiàn)就算我把這些模塊都抽離了,去到其他的項(xiàng)目還是要做出一定的修改,雖然有做接口,但是接口是接后臺(tái)的,我模塊間的接口還沒(méi)有做。這樣的抽離會(huì)伴隨著一大堆額外的支付(估計(jì)的啦,但是根據(jù)經(jīng)驗(yàn)這些是必然的~),并且新的JS框架在整體框架里面并不兼容(下班的時(shí)候發(fā)現(xiàn)某些資源訪問(wèn)出問(wèn)題了),雖然不死心,但是還是放棄了(萬(wàn)惡的進(jìn)度,次奧)。這一版的代碼也沒(méi)有做保存,呃SVN也沒(méi)有更新上去~。我的U盤移硬上面也沒(méi)有備份,但是所有的源碼都給我一怒之下付諸Delete了。僅以此篇日志留作紀(jì)念。
另外我知道博客園是個(gè)神奇的地方,如果有同人遇到相同的困擾并且切實(shí)解決了的話,可否分享一下呢?有回必復(fù)!

相關(guān)文章

最新評(píng)論

铁岭市| 凌源市| 新竹市| 汉阴县| 洛浦县| 永年县| 苏尼特左旗| 济源市| 秀山| 灌阳县| 宿松县| 新乡市| 平阴县| 阳新县| 乌拉特前旗| 高州市| 邓州市| 宜川县| 两当县| 平武县| 玉门市| 沈丘县| 包头市| 克拉玛依市| 淅川县| 宁南县| 开化县| 洛浦县| 博白县| 墨竹工卡县| 南靖县| 黄陵县| 卢湾区| 龙山县| 克山县| 永宁县| 赤城县| 珠海市| 阳朔县| 咸宁市| 邵武市|