首頁(yè) > 專家說(shuō)

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

來(lái)源:新能源網(wǎng)
時(shí)間:2024-08-17 11:55:36
熱度:

JS前端框架關(guān)于重構(gòu)的失敗經(jīng)驗(yàn)分享【專家解說(shuō)】:好了開始吧 重構(gòu)這個(gè)其實(shí)也不是什么大動(dòng)作,主要要實(shí)現(xiàn)的功能嘛,就是把現(xiàn)有的JS代碼重新劃分一下,解耦現(xiàn)有模塊。然后我打算把現(xiàn)有的程序

【專家解說(shuō)】:好了開始吧
重構(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ū)ο蟀。玩湴≈愲s七雜八的東西然后發(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缓笏伎剂艘幌?,想在最后加載的一個(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ì)念。

教訓(xùn)就是如果一開始我就有一個(gè)前端模塊化的思想,就不會(huì)走到今天這一步了。以我的能力完全可以做到,但是現(xiàn)在已經(jīng)積重難返了~還是那些萬(wàn)惡的奶粉廣告,讓寶寶有個(gè)好的開始,那么我的就是讓代碼有個(gè)好的開始吧~原諒我這個(gè)不及格的粑粑~~ (T_T)

另外我知道博客園是個(gè)神奇的地方,如果有同人遇到相同的困擾并且切實(shí)解決了的話,可否分享一下呢?有回必復(fù)!
  1. 現(xiàn)澆鋼筋混凝土框架柱出現(xiàn)斷層的整改方法
    2024-08-17
  2. 贛州120平方的房子,用木質(zhì)材料的裝飾風(fēng)格,全框架結(jié)構(gòu),全包,大約要多少錢
    2024-08-17
  3. 誰(shuí)能給我寫出七年級(jí)(下)人教版生物第一章的知識(shí)結(jié)構(gòu)框架
    2024-08-17
  4. 急求人教版高一地理必修二前三節(jié)知識(shí)框架
    2024-08-17
  5. 聯(lián)合國(guó)氣候變化框架公約《京都議定書》要求發(fā)達(dá)國(guó)家限制CO2(1)請(qǐng)你用文字表述的方式簡(jiǎn)單形象地表達(dá)“地
    2024-08-17
  6. 奇瑞汽車品牌構(gòu)架的整體規(guī)劃 最好是框架圖附帶說(shuō)明
    2024-08-17
  7. 《中共中央關(guān)于制定國(guó)民經(jīng)濟(jì)和社會(huì)發(fā)展第十二個(gè)五年規(guī)劃的建議》的基本框架和主要內(nèi)容
    2024-08-17
  8. 域合作框架性協(xié)議》,正式啟動(dòng)了黃河航運(yùn)聯(lián)合開發(fā)建設(shè)。根據(jù)規(guī)劃,到2030年,黃河將像長(zhǎng)江一樣實(shí)現(xiàn)全線通
    2024-08-17
  9. 煤礦會(huì)計(jì)核算框架包括什么?
    2024-08-17
  10. 《聯(lián)合國(guó)氣候變化框架公約》第16次締約方會(huì)議暨《京都議定書》第6次締約方會(huì)議,于2010年11月29日至12月1
    2024-08-17
  11. 八年級(jí)下冊(cè)地理第五章知識(shí)框架圖
    2024-08-17
  12. 高一地理必修二知識(shí)框架
    2024-08-17
  13. 高一地理必修二知識(shí)點(diǎn)框架
    2024-08-17
  14. 框架結(jié)構(gòu)里面的加氣塊上面能掛熱水器嗎
    2024-08-17
  15. 求高中生物知識(shí)框架
    2024-08-17