天天看點

《JavaScript架構設計》——2.2 加載器所在路徑的探知

本節書摘來自異步社群《javascript架構設計》一書中的第2章,第2.2節,作者:司徒正美著,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視

要加載一個子產品,我們需要一個url作為加載位址,一個script作為加載媒介。但使用者在require時都用id,是以我們需要一個将id轉換為url的方法。思路很簡單,強加個約定,url的合成規則為。

<code>basepath + 子產品id + ".js"</code>

由于浏覽器自上而下分析dom,當浏覽器在解析我們的javascript檔案(這個javascript檔案是指加載器)時,它就肯定dom樹中最後加入的script标簽。是以,我們有下面這個方法。

這個能滿足99%的需求。但如果我們不得不動态加載我們的加載器呢?在舊版本下ie就會折戟沉沙,這個不奇怪,許多正常方法在ie6、ie7、ie8都失效,除了api的差異性,還有它本身的各種bug。這個我很難指出是什麼,總之要解決。如下面的這個javascript片斷。

這時就需要用readychange屬性,微軟在document、image、xhr、script等東西都擁有了這個屬性,用來檢視加載情況。

這樣就搞定了。現在想一下能否優化。通路dom比一般的javascript代碼消耗高許多。這時我們可以利用error對象。

當然opera與chrome也有一些屬性可以供我們提取,但比較複雜,這裡就略去了。

為了友善以後使用,我們先将mass.js這個去掉吧。在現實中,為了防止緩存,這個後面可能帶版本号、時間戮什麼的,也要去掉。

<code>url = url.replace(/[?#].*/, "").slice(0, url.lastindexof("/") + 1);</code>

在mass并行加載器中,有一個getcurrentscript方法,它用于取得正在被解析的javascript檔案的src,而不局限于加載器的javascript位址。這個對實作匿名子產品非常有用。想象一下,我們有個require(["a","b","c","d","e"], callback),這些子產品在define裡面都沒有id,識别哪一個子產品是對應哪個javascript檔案加載非常麻煩。或者使用iframe,将各個子產品的加載獨立于一個沙箱環境中,或者使用一些變量做辨別(這存在被覆寫的危險),是以mass再次發掘error對象的私有屬性。

繼續閱讀