關於javascript模組載入的思索

來源:互聯網
上載者:User

最近一直為此頭痛,姑且把我能想到的東西都寫出來吧。由於不是簡單把頁面上手寫的script轉為javascript添加,我們需要考慮的東西主要有兩個:載入的順序,載入前後指令碼的運作。

先說第一個,假如我們已有一載入機制了,要載入一個新模組,當然新模組是在另一個JS檔案中。這時,我們可以描述為:

loader ---> a.js

這個載入過程可能會出些意外,如伺服器忙碌等問題,暫時無法為我們產生JS檔案,我們就需要再次請求,但也可能永遠請求不上,因為那是死鏈,背景人傻了腦袋,改了地址也不通知聲,我們需要一個截止期限。這時,我們可以描述為:

 loader ---> a.js ---> a.js ---> .....----> timeout

如果那個模組要依賴於其他模組呢,那麼我就必須在載入它之前載入其他模組了。這時,我們可以描述為:

      loader ---> b.js ---> a.js ---> .....----> timeout

但記錄這些依賴關係的資訊肯定在a.js上,而不在loader上,通過a.js我們才能得知b.js,換言之要遵循最少知識原則(Law of Demeter)。

這個問題的解決,MochiKit興許能給我們一些靈感吧。

另一個問題是javascript是單線程的,而載入需要一個時間,並且通常是非同步。當我們執行載入函數後,可能JS引擎會繼續執行下面需要新模組支援的代碼片斷,由於這時新模組還沒有載入完畢,當要用到新模組的屬性方法就會報錯。解決方案有二,強制上面的loader活動的時間與載入時間一樣長,換言之,創造一個阻塞的環境。這容易實現,可參照dojo。不過如果載入的模組過多,難免會造成body標籤內一片空白。另一個方法是使用回呼函數,那麼就要求我們把接著下來的代碼八卸大塊,每個代碼片斷都是相對獨立,所有邏輯都是寫在一個函數體中。看上去非常不優雅,但也別無他法,這是YUI的做法。

嘛,基本上就是這樣,是一個世界難題……不要問我要代碼,認為沒有必要搞這麼複雜的同志們現在都被迫幹這事呢,世事難料啊!

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.