非同步模組定義AMD

2021-07-03 05:26:34 字數 1951 閱讀 4810

全稱為asynchronous module definition,非同步元件(或模組)定義。amd是一種機制,使用這種機制,元件和它的依賴就可以實現非同步載入。

define(id?, dependencies?, factory);

元件id是元件的唯一識別符號,在和元件id一對一的指令碼檔案(乙個指令碼檔案中只有乙個define)中這個id可以沒有,而且最好沒有。這是因為元件載入器在請求元件的時候是必須給乙個元件id的,而且需要配置元件id對應的指令碼檔案路徑。載入器根據檔案路徑就能找到對應的元件指令碼檔案。所以,載入器可以直接用請求時使用的id作為這個元件的id。這樣的好處是元件轉移到其它專案的時候不需要怕id衝突而需要修改元件id,所以,使用define方法定義元件的時候,最好不要設定元件id。

而且,根據amd規範,define方法的第乙個引數,元件id必須是頂級或絕對id,不能是相對id。這更容易導致元件id衝突所以,所以,我認為更不應該在define方法中設定元件id。

amd認為使用define可以幫助靜態分析工具,比如build,我覺得沒這個必要,因為更多時候在define中元件id都沒有,分析沒有意義。

根據amd規範,乙個檔案中定義多個元件也是可以的,但這就必須給每個define分配乙個元件id。

注意,在define方法中出現的元件id必須是頂級或絕對id。但在require方法或define的依賴陣列中出現的元件id,可以是相對id(相對於當前元件的id,而不是相對於元件的路徑),並且完全相容commonjs關於元件id格式的規範

commonjs關於元件id的約定:

l  元件id由'/'分隔的詞組成,每個詞必須是駝峰式寫法,也可以是'.'、'..',用於表示相對關係;

l  元件id可以有'.js'字尾,也可以沒有'.js'字尾;

舉例:假如元件'jquery/dialog'對應路徑'jquery/ui/dialog.js',而它依賴'jquery/jquery.js',就需要在'dialog.js'檔案中把require寫成這樣:require( '../jquery')或require('../jquery.js')。

也就是第二個陣列,依賴陣列包含依賴的元件id,這裡的元件id允許相對id。如果沒有定義依賴陣列,理論上預設是['require','exports','module'],但這可以取決於factory這個方法的引數個數。如果引數只有乙個,那麼依賴陣列就可以只是['require'],其它兩個依此類推。

如果factory是個方法,它的返回值就是該元件對外開發的值。如果factory是個物件,那麼factory就是對外開放的值。

這個屬性是個object,有這個屬性就表示這個全域性的define方法符合amd規範。至於amd有什麼屬性,amd沒有規定,可以根據情況自己寫。

amd對於require方法的要求比define低,元件載入器可以隨意發揮,只要保證能正常工作即可。比如requirejs的require方法就可以一次要求多個元件,而根據commonjs規範的元件載入器一次只能要求乙個元件。

根據commonjs的指導,commonjs是沒有define方法的,依賴完全通過require('module-id')獲取。好在在瀏覽器中,function物件有乙個tostring()方法,可以把方法轉換成文字格式。通過在文字中搜尋require('module-id')就可以獲取所有依賴。缺點就是這樣就失去了根據條件載入依賴的能力,而是一股腦全部載入。

amd通過define方法宣告模組,commonjs是沒有define方法的,所以amd和commonjs是兩回事。但是,根據define的第二個引數的要求,可以看出,amd的元件同樣可以有require、exports、module這三個變數,因此,把commonjs元件的**拷貝到define方法中,大部分**不用修改就可以用的,這點還是比較方便。

注意:opera手機平台的function物件沒有tostring()方法,因此commonjs格式的指令碼在這個平台上可以不能正常執行。

AMD模組定義規範

amd 即asynchronous module definition,中文名是 非同步模組定義 的意思。它是乙個在瀏覽器端模組化開發的規範,伺服器端的規範是commonjs。模組將被非同步載入,模組載入不影響後面語句的執行。所有依賴某些模組的語句均放置在 函式中。amd是requirejs在推廣過...

AMD模組定義規範

amd 即asynchronous module definition,中文名是 非同步模組定義 的意思。它是乙個在瀏覽器端模組化開發的規範,伺服器端的規範是commonjs。模組將被非同步載入,模組載入不影響後面語句的執行。所有依賴某些模組的語句均放置在 函式中。amd是requirejs在推廣過...

前端模組化 AMD 詳解

a.js script b.js script d.js script e.js script f.js script g.js script 上面這樣載入主要出現的問題 為了解決這樣的問題 於是有了require.js 官網位址 現在比較常用的amd 主要分為3步 js require.js sc...