CommonJS 是以在瀏覽器環境以外構建 javaScript 生態系統爲目標而產生的寫一套規範,主要是爲了解決 javaScript 的做用域問題而定義的模塊形式,能夠使每一個模塊它自身的命名空間中執行,該規範的主要內容是,模塊必須經過 module.exports 導出對外的變量或者接口,經過 require() 來導入其餘模塊的輸出到當前模塊的做用域中;目前在服務器和桌面環境中,node.js 遵循的是 CommonJS 的規範;前端
CommonJS 對模塊的加載時同步的;java
AMD 主要是爲前端 js 的表現指定的一套規範;而 CommonJS 是主要爲了 js 在後端的表現制定的,它不適合前端;node
AMD 是 Asynchronous Module Definition 的縮寫,意思是 異步模塊定義;採用的是異步的方式進行模塊的加載,在加載模塊的時候不影響後邊語句的運行;後端
AMD 也是採用 require() 語句加載模塊的,可是不一樣於 CommonJS ,它有兩個參數;require(['模塊的名字'],callBack);requireJs 遵循的就是 AMD 規範;數組
CMD 是 Common Module Definition 的縮寫,是 seajs 推薦的一套規範,CMD 也是經過異步的方式進行模塊的加載的,不一樣於 AMD 的是,CMD 的加載是按照就近規則進行的,AMD 依賴的是前置;CMD 在加載的使用的時候會把模塊變爲字符串解析一遍才知道依賴了哪一個模塊;瀏覽器
CommonJS 其實也有瀏覽器端的實現,原理是先將全部模塊都定義好並經過 id 索引方便的在瀏覽器環境中進行解析;服務器
AMD 的實現實際上是經過 define 函數定義在閉包中,例如:define(id?: String,dependencies?: String[],factory: Function | Object);閉包
其中,id 是模塊的名字,是一個可選的參數;dependencied 指定了所要依賴的模塊列表,是一個數組,每一個依賴的模塊的輸出將做爲參數一次傳入 factory 中;若是沒有指定 dependencies 的話,那麼默認的就是 ["require","exports","module"];factory 包括了模塊的具體實現,它是一個函數或者對象;若是是函數,那麼它的返回值就是模塊的輸出接口或者值;異步