天天看點

AMD、CMD、CommonJS規範

1、産生背景

AMD、CMD、CommonJS都是為了解決JavaScript的子產品加載而産生,倡導子產品化開發理念。JavaScript沒有自己的子產品加載機制,當大量的複雜的代碼産生時,沒有好的加載機制,就會導緻代碼管理混亂,多人協作出問題。

2、規範約定

1)AMD(Asynchronous Module Definition),異步加載子產品定義,AMD 是 RequireJS 在推廣過程中對子產品定義的規範化的産出。先定義所有依賴,然後在加載完成後在回調函數中執行。

require([module], callback);

AMD規範,其實是不符合寫代碼的邏輯順序,需要提前說明依賴的子產品。

2)CMD (Common Module Definition)規,通用子產品定義,CMD是SeaJS在推廣過程中對子產品定義的規範化的産出。CMD則是依賴就近,用的時候再require。

define(function(require, exports, module) {

   var echarts = require('echarts');

});

CMD規範,比較符合寫代碼的邏輯順序,不管寫到哪兒發現需要依賴另一個子產品,就可以使用require引入即可。

3)CommonJS規範是一個有志于建構 JavaScript 生态圈的組織,偏向于伺服器端的規範。NodeJS就采用了CommonJS。一個單獨的檔案就是一個子產品,加載子產品使用require方法,該方法讀取一個檔案并執行,最後傳回檔案内部的exports對象。因為在伺服器讀取子產品都是在本地磁盤,加載速度很快。但是如果在用戶端,加載子產品的時候有可能出現“假死”狀況。

3、不同之處

CommonJS是伺服器端的規範,與另外兩個标準實際不沖突。

AMD和CMD的不同之處如下:

定位有差異。RequireJS 想成為浏覽器端的子產品加載器,同時也想成為 Rhino / Node 等環境的子產品加載器。Sea.js 則專注于 Web 浏覽器端,同時通過 Node 擴充的方式可以很友善跑在 Node 環境中。

遵循的規範不同。RequireJS 遵循 AMD(異步子產品定義)規範,Sea.js 遵循 CMD (通用子產品定義)規範。規範的不同,導緻了兩者 API 不同。Sea.js 更貼近 CommonJS Modules/1.1 和 Node Modules 規範。

推廣理念有差異。RequireJS 在嘗試讓第三方類庫修改自身來支援 RequireJS,目前隻有少數社群采納。Sea.js 不強推,采用自主封裝的方式來“海納百川”,目前已有較成熟的封裝政策。

對開發調試的支援有差異。Sea.js 非常關注代碼的開發調試,有 nocache、debug 等用于調試的插件。RequireJS 無這方面的明顯支援。

兩者代碼品質有差異。RequireJS 是沒有明顯的 bug,SeaJS 是明顯沒有 bug。

插件機制不同。RequireJS 采取的是在源碼中預留接口的形式,插件類型比較單一。Sea.js 采取的是通用事件機制,插件類型更豐富。

4、參考資料

https://www.cnblogs.com/highsea90/p/4383895.html

https://www.jianshu.com/p/09ffac7a3b2c

http://blog.csdn.net/xcymorningsun/article/details/52709608