首頁 web前端 js教程 JS前端框架關於重構的失敗經驗分享_javascript技巧

JS前端框架關於重構的失敗經驗分享_javascript技巧

May 16, 2016 pm 05:40 PM
前端框架 重構

好了開始吧
重構這個其實也不是什麼大動作,主要要實現的功能嘛,就是把現有的JS程式碼重新劃分一下,解耦現有模組。然後我打算把現有的程式劃分一下模組然後重新打包做一個命名空間實作use或類似java的Package的東西。那我只要載入一個use的js檔案呼叫這個檔案的use函數,透過設定某些參數,我可以動態地載入所需要的模組。這個是最完美的想法(那時我很愚蠢、很天真)。好的,惡夢開始了。
前提,我低估了3個月前的自己。 //好吧,下面可能會出現un文明用語~~

首先,計劃的第一天,我的打算是分離這個程式裡面最需要解耦的部分,自製控制部分。說起來,人家也嘗試著寫了一些窗體控件什麼的比如Panel.js,Button.js之類的控件這裡面有一大堆js文件,雖然我已經劃分好文件夾了,但是看到index頁面上面那一連串的<script>標籤,各種痛的說。於是惡夢進入第二階段,我想載入一個JS文件,而這個JS文件可以動態地載入所有的控制項JS。如果想了解"動態加載JS"的相關知識,請去度娘G娘那裡問個明白。我想應該會搜到好多3異步 1Ajax的實作。好了,這些都是廢話,參考了《高效能JavaScript》一書,產生以下程式碼: <BR><div class="codetitle"><span><a style="CURSOR: pointer" data="2608" class="copybut" id="copybut2608" onclick="doCopy('code2608')"><U>複製程式碼 程式碼如下:<div class="codebody" id="code2608"> <BR>function loadScript (url, callback){ <BR>var script = document.createElement("script"); <BR>script.type = "text/javascript"; <BR>if (script.readyState){ //IE <BR>script.onreadystatechange = function(){ <BR>if(script.readyState == "loaded" || script.readState == "complete"){ <BR>script. onreadystatechange = null; <BR>callback(); <BR>} <BR>} <BR>}else{ <BR>script.onload = function(){ <BR>callback(); <BR>} <BR>} <BR> } <BR>script.src = url; <BR>document.getElementsByTagName("head")[0].appendChild(script); <BR>} <BR> <BR>好的悲劇慢慢開始,首先我的控制項都是基於JQuery的那麼必然要loadScript(jqueryURL, function(){//載入我的控制項s}),好的這裡說到這裡打斷一下,下面再接上。 <BR>然後我又突發奇想要做命名空間的功能,好的研究了物件導向啊,原型鍊啊之類雜七雜八的東西然後發現這種打點引用的功能好抽象,給那本《javascript設計模式》的書忽悠的七零八落。最後在了解了原型模式之後,還是一團迷霧。好的,我覺得我要重新思考這個問題,我其實只是想要打點出控件而已,那麼我只要將我的控制項作為一個物件的屬性綁定到一個全域的物件上面就好了。於是我用了自己的英文名Gssl作為一個對象得出如下結構: <div class="codetitle"><span><a style="CURSOR: pointer" data="94322" class="copybut" id="copybut94322" onclick="doCopy('code94322')"><U>複製代碼代碼如下:<div class="codebody" id="code94322"><BR><BR>代碼如下:<BR><BR> <div class="codetitle">var Gssl = {} <span><a style="CURSOR: pointer" data="72296" class="copybut" id="copybut72296" onclick="doCopy('code72296')"> <U>好了回到上面打斷的地方,我的想法就是在動態加載JS的時候順便構造我的全局對象並綁定到空間名為Gssl下,具體實作如下: <div class="codebody" id="code72296">複製程式碼<BR><BR><BR> 程式碼如下:<BR><BR> <BR>loadScript(jqueryLURL , function(){ <BR>//載入我的控制項s <BR>loadScript(controlURL, function(){ //綁定控制<🎜>Gssl.control = control; <🎜>}); <>Gssl.control = control; <🎜>}); 🎜>}); <🎜><🎜><BR>寫到這裡,測驗是調通了,昨天晚上,小開心了一下,但是程式設計師的直覺話我知,惡夢還沒結束。 <BR>今天早上回去把這個動態載入JS的JS檔案引用到了我的頁面那裡,結果因為非同步的特點,後面的程式碼沒有等到這個Gssl的物件產生完成就開始執行了(我去,這不合理啊)。然後思考了一下,想在最後加載的一個控件那裡做一個ready標誌位以標誌Gssl到底有沒有加載完成。但發現每個元件各自有各自的callback函數,你根本就不知道哪一個才是最後載入的,雖然程式碼執行是有順序的,但這個傳輸的平行性又讓你不能確定到底哪一個才是最後一個。好的我徹底崩潰了,於是想了一個非常2B的方法,乾脆寫一個函數來卡住程式2秒吧,兩秒肯定可以了~。然後發現setTimeout TM不能卡代碼的,他的好基友setIXXXXX也是不能卡代碼的。好的,朕生氣了,寫了一個死循環循環判斷ready位。好的,瀏覽器不乾了。 <br><br>回到原點,我開始考慮嘗試遞歸式的加載就是在Callback的時候才去加載下一個控件,這樣我就能知道控件什麼時候加載完了。但是仔細一想,我擦,如果要這樣加載那麼我還動態加載個屁啊,這不就一點也沒有提高到效率麼。然後看了各種框架的ready方法的實作。嗯 TM單文件的就是IMBA啊。那麼擺在我面前的就只有一條路了,把所有的控制都寫在一個JS上面。這樣根本就是避重就輕啊。 <br><br>然後我就不斷在這種提出解決方案,然後不斷自我吐槽中度過了噩夢般的一天。快下班了,我還在不停地思考這個問題究竟有沒有解。然後腦裡面第三個聲音開始了,志偉啊~(呵呵本人的名字就是這個了~),真的有必不是?好的,不得不承認,每次脫離惡夢就得靠他。然後我把整個專案的資料夾打開每層每層地點開又退回去,然後思考,好吧,不是寫小說,這些思考時候的小動作就不描述了(我會告訴你我想問題的時候會好像精神病人一樣犯傻麼)。最後我發現就算我把這些模組都抽離了,去到其他的專案還是要做出一定的修改,雖然有做接口,但是接口是接後台的,我模組間的接口還沒做。這樣的抽離會伴隨著一大堆額外的支付(估計的啦,但是根據經驗這些是必然的~),並且新的JS框架在整體框架裡面並不兼容(下班的時候發現某些資源訪問出問題了),雖然不死心,但還是放棄了(萬惡的進度,次奧)。這版的程式碼也沒做保存,呃SVN也沒更新上去~。我的U盤移硬上面也沒有備份,但是所有的源碼都給我一怒之下付諸Delete了。僅以此篇日誌留作紀念。 <br><br>教訓就是如果一開始我就有一個前端模組化的思想,就不會走到今天這一步了。以我的能力完全可以做到,但是現在已經積重難返了~還是那些萬惡的奶粉廣告,讓寶寶有個好的開始,那麼我的就是讓代碼有個好的開始吧~原諒我這個不及格的瑤粑~~ (T_T)<br><br>另外我知道博客園是個神奇的地方,如果有同人遇到相同的困擾並且切實解決了的話,可否分享一下呢?有回必復!</script>

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

如何解決Python的程式碼中的程式碼複雜度過高錯誤? 如何解決Python的程式碼中的程式碼複雜度過高錯誤? Jun 24, 2023 pm 05:43 PM

Python是一門簡單易學高效的程式語言,但當我們在編寫Python程式碼時,可能會遇到一些程式碼複雜度過高的問題。這些問題如果不解決,會使得程式碼難以維護,容易出錯,降低程式碼的可讀性和可擴充性。因此,在本文中,我們將討論如何解決Python程式碼中的程式碼複雜度過高錯誤。了解程式碼複雜度程式碼複雜度是一種度量程式碼難以理解和維護的性質。在Python中,有一些指標可以用

如何解決Python的程式碼的可維護性差錯誤? 如何解決Python的程式碼的可維護性差錯誤? Jun 25, 2023 am 11:58 AM

Python作為一門高階程式語言,在軟體開發中得到了廣泛應用。雖然Python有許多優點,但許多Python程式設計師經常面臨的問題是,程式碼的可維護性較差。 Python程式碼的可維護性包括程式碼的易讀性、可擴充性、可重複使用性等面向。在本篇文章中,我們將著重討論如何解決Python程式碼的可維護性差的問題。一、代碼的易讀性代碼可讀性是指代碼的易讀程度,它是代碼可維護性的核

如何做好Java程式碼的重構 如何做好Java程式碼的重構 Jun 15, 2023 pm 09:17 PM

作為世界上最受歡迎的程式語言之一,Java已成為許多企業和開發者的首選語言。然而,程式碼的重構對於保持程式碼品質以及開發效率至關重要。 Java程式碼由於其複雜性,隨著時間的推移可能會變得越來越難以維護。本文將討論如何進行Java程式碼的重構,以提高程式碼品質和可維護性。了解重構的原則Java程式碼重構的目的在於改進程式碼的結構、可讀性和可維護性,而不是簡單的「改變程式碼」。因

深入理解Go語言中的函數重構技巧 深入理解Go語言中的函數重構技巧 Mar 28, 2024 pm 03:05 PM

在Go語言程式開發中,函數重構技巧是十分重要的一環。透過優化和重構函數,不僅可以提高程式碼品質和可維護性,還可以提升程式的效能和可讀性。本文將深入探討Go語言中的函數重構技巧,結合具體的程式碼範例,幫助讀者更能理解和應用這些技巧。 1.程式碼範例1:提取重複程式碼片段在實際開發中,經常會遇到重複使用的程式碼片段,這時就可以考慮將重複程式碼提取出來作為一個獨立的函數,以

Go語言中的最佳化與重構的方法 Go語言中的最佳化與重構的方法 Jun 02, 2023 am 10:40 AM

Go語言是一門相對年輕的程式語言,雖然從語言本身的設計來看,其已經考慮到了很多優化點,使得其具備高效的性能和良好的可維護性,但是這並不代表著我們在開發Go應用時不需要最佳化和重構,特別是在長期的程式碼累積過程中,原來的程式碼架構可能已經開始失去優勢,需要透過最佳化和重構來提高系統的效能和可維護性。本文將分享一些在Go語言中最佳化和重構的方法,希望能對Go開發者有所幫

React與Vue的比較:如何選擇合適的前端框架 React與Vue的比較:如何選擇合適的前端框架 Sep 26, 2023 am 09:15 AM

React與Vue的比較:如何選擇合適的前端框架前端開發中,選擇合適的框架對於專案的成功至關重要。在眾多的前端框架中,React和Vue無疑是最受歡迎的兩個選擇。本文將透過比較React和Vue的優缺點、生態系統、性能以及開發體驗等方面,幫助讀者選擇適合自己專案的前端框架。一、React和Vue的優缺點對比React的優點:元件化開發:React將UI拆分為

VUE是用於前端還是後端? VUE是用於前端還是後端? Apr 03, 2025 am 12:07 AM

Vue.js主要用於前端開發。 1)它是一個輕量級且靈活的JavaScript框架,專注於構建用戶界面和單頁面應用。 2)Vue.js的核心是其響應式數據系統,數據變化時視圖自動更新。 3)它支持組件化開發,UI可拆分為獨立、可複用的組件。

React程式碼重構指南:如何改善前端應用的程式碼結構和可讀性 React程式碼重構指南:如何改善前端應用的程式碼結構和可讀性 Sep 26, 2023 am 08:37 AM

React程式碼重構指南:如何改善前端應用的程式碼結構和可讀性前端開發中,程式碼結構和可讀性對於專案的維護和擴展至關重要。當專案規模逐漸增大,程式碼逐漸變得複雜,我們就需要進行程式碼重構,以便更好地組織程式碼、提高可維護性和可讀性。本文將從以下幾個方面介紹如何重構React程式碼,並提供具體的程式碼範例。一、元件拆分在React開發中,拆分成更小的元件是一種有效的程式碼重構方

See all articles