CommonJS,AMD,CMD規範


1. Javascript 先天缺乏模塊的功能。在其他高級語言中,Java有類文件,Python有import機制,Ruby有require,PHP有include和require,而Javascript 則需要依靠<script>標籤引入代碼,當腳本多的時候,會顯得雜亂無章。

2. 針對以上問題,CommonJS應運而生。CommonJS爲Javascript制定了一個美好願景:能夠在任何地方運行!(Not just for browser), CommonJS希望彌補Javascript沒有標準的缺陷(沒有模塊系統,標準庫較少,沒有標準接口,缺乏包管理系統),可以編寫大型應用,如服務器端Javascript,命令行工具,桌面圖形界面應用程序,混合應用等。

3. CommonJS規範涵蓋:

模塊、二進制Buffer, 字符集編碼,I/O流,進程環境,文件系統,套接字,web服務器網管接口,包管理等。

4. Node.JS遵循CommonJS規範,推進了CommonJS的發展.

5. CommonJS主要是爲了JS在後端的表現制定的,不適合前端。爲什麼這麼說呢?

前後端Javascript分別被擱置在HTTP的兩端,二者扮演的角色不同:



瀏覽器端Javascript

服務器端Javascript

代碼的執行需要經歷從同一服務器端分發到多個客戶端執行相同代碼需要多次執行

瓶頸

在於帶寬

在於CPU和內存資源

代碼加載方式

需要通過網絡加載代碼

從磁盤加載代碼(二者速度不在一個數量級上)

6. 於是AMD出現了,Asynchronous Module Definition. 異步模塊定義。

        它就主要爲前端JS的表現制定規範

AMD規範只有一個API,其模塊定義如下:

define(id?,dependencies?,factory); //id,dependencies可選,factory內容就是實際代碼的內容

a. Id:模塊標識,可以省略,這裏的模塊標識指的是自己,即整個文件。所以當id省略的時候,就相當於定義了一個匿名模塊,這時候模塊文件名就是 模塊標識。e.g.模塊文件放在a.js中,那麼a就是模塊名。

b.  dependencies: 依賴的模塊。AMD規範要在聲明模塊的時候指定所有的依賴,並且還要當做形參傳到factory裏面。例如:

define(['dep1', 'dep2'], function ( dep1, dep2  ){ … });

 

一個不包含依賴關係的例子:

define(function(){

var exports = {};

exports.method = function(){ ...};

return exports;

...

});


c. define函數中不難想到define函數具有異步性。它在執行時首先會異步去調用第二個參數中列出的依賴模塊,當所有模塊被載入完成後,如果第三個參數是一個回調函數則執行。

d. Node.js中,沒有看到define將模塊包起來,是因爲Node實現了隱式包裝(即在對模塊進行 編譯時,node會對模塊進行頭尾包裝,以隔離各個模塊文件,防止變量污染)。

e. requireJS就是實現了AMD規範。


7. CMD規範由國內的玉伯提出,與AMD規範的區別在於定義模塊和依賴引入的部分。風格更接近於Node.可以看看Sea.js

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章