CommonJS
CommonJS 是以在瀏覽器環境之外構建 javaScript 生態系統為目標而產生的寫一套規范,主要是為了解決 javaScript 的作用域問題而定義的模塊形式,可以使每個模塊它自身的命名空間中執行,該規范的主要內容是,模塊必須通過 module.exports 導出對外的變量或者接口,通過 require() 來導入其他模塊的輸出到當前模塊的作用域中;目前在服務器和桌面環境中,node.js 遵循的是 CommonJS 的規范;
CommonJS 對模塊的加載時同步的;
AMD
AMD 主要是為前端 js 的表現指定的一套規范;而 CommonJS 是主要為了 js 在后端的表現制定的,它不適合前端;
AMD 是 Asynchronous Module Definition 的縮寫,意思是 異步模塊定義;采用的是異步的方式進行模塊的加載,在加載模塊的時候不影響后邊語句的運行;
AMD 也是采用 require() 語句加載模塊的,但是不同於 CommonJS ,它有兩個參數;require(['模塊的名字'],callBack);requireJs 遵循的就是 AMD 規范;
CMD
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 包括了模塊的具體實現,它是一個函數或者對象;如果是函數,那么它的返回值就是模塊的輸出接口或者值;