關于 AMD, CMD 以及 CommonJS

相信大家對這三種規范有一定的了解,今天在這里我就把這個梳理一下,加深印象!


AMD規范:全稱”Asynchronous Module Definition”,稱為 異步模塊加載規范 。一般應用在瀏覽器端。流行的瀏覽器端異步加載庫RequireJS實現的就是AMD規范。

CMD規范,全稱”Common Module Definition”,稱為 通用模塊加載規范。一般也是用在瀏覽器端。瀏覽器端異步加載庫Sea.js實現的就是CMD規范。

CommonJS: 稱為同步模塊加載規范,也就是說,只有加載完成,才能執行后面的操作。

AMD特點: 依賴前置,提前執行!

代碼塊

define(['jquery','underscore'], function($, _) {
  //methods
  function a(){}; //私有方法
  function b(){}; //公有方法

  return {
    b: b
 }
})

define是AMD 規范用來聲明模塊接口,示例中的第一個參數是一個數組,表示當前模塊的依賴。第二個參數是一個回調函數,表示此模塊的執行體。只有當依賴數組中的所有依賴模塊都是可用的時,AMD模塊加載器(比如RequireJS)才會去執行回調函數并返回此模塊的暴露接口。

注意,回調函數中參數的順序與依賴數組中的依賴順序一致。(即:jquery->$,underscore->_)

當然,在這里我可以將回調函數的參數名稱改成任何我們想用的可用變量名,這并不會對模塊的聲明造成任何影響。

除此之外,你不能在模塊聲明的外部使用$或者_,因為他們只在模塊的回調函數體中才有定義。

CMD特點: 依賴就近,延遲執行!

代碼塊

define(function(require, exports, module){
  var a = require('./a');
  a.doSomething();
  var b = require('./b');
  b.doSomething();
});

CMD與AMD區別

對于依賴的模塊,AMD 是提前執行,CMD 是延遲執行。
CMD 推崇依賴就近,AMD 推崇依賴前置。

·······

CommonJS規范

代碼塊

// filename: foo.js
// dependencies
var $ = require('jquery');

// methods
function myFunc() {};

// exposed public method (single)
module.exports = myFunc;

上邊是使用CommonJS規范聲明一個名為foo模塊的方式,同時依賴jquery模塊。

AMD規范與CommonJS規范的兼容性

CommonJS規范加載模塊是同步的,也就是說,只有加載完成,才能執行后面的操作。

AMD規范則是非同步加載模塊,允許指定回調函數。

Node.js遵循CommonJS規范。這是因為Node.js主要用于服務器編程,模塊文件一般都已經存在于本地硬盤,所以加載起來比較快,不用考慮非同步加載的方式。但如果是瀏覽器環境,要從服務器端加載模塊,這時就必須采用非同步模式,因此瀏覽器端一般采用AMD規范

有問題或者意見建議,歡迎大家直接找我,謝謝!

參考文獻:http://blog.gejiawen.com/2014/07/18/small-talk-about-fe-spec/

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容