CommonJS、CMD和AMD規範分別是什麼

shirleyYing發表於2017-03-25

CommonJS、CMD和AMD規範分別是什麼

Commonjs是用在伺服器端的,同步的,如nodejs
amd, cmd是用在瀏覽器端的,非同步的,如requirejs和seajs
其中,amd先提出,cmd是根據commonjs和amd基礎上提出的。

為什麼暈呢?是因為沒用,或用得太少。光看看文章是不行的。

CommonJS

CommonJs 是伺服器端模組的規範,Node.js採用了這個規範。

根據CommonJS規範,一個單獨的檔案就是一個模組。載入模組使用require方法,該方法讀取一個檔案並執行,最後返回檔案內部的exports物件。

例如:
// foobar.js

//私有變數
var test = 123;

//公有方法
function foobar () {

  this.foo = function () {
    // do someing ...
  }
  this.bar = function () {
    //do someing ...
  }
}

//exports物件上的方法和變數是公有的
var foobar = new foobar();
exports.foobar = foobar;

//require方法預設讀取js檔案,所以可以省略js字尾
var test = require('./boobar').foobar;

test.bar();


CommonJS 載入模組是同步的,所以只有載入完成才能執行後面的操作。像Node.js主要用於伺服器的程式設計,載入的模組檔案一般都已經存在本地硬碟,所以載入起來比較快,不用考慮非同步載入的方式,所以CommonJS規範比較適用。但如果是瀏覽器環境,要從伺服器載入模組,這是就必須採用非同步模式。所以就有了 AMD CMD 解決方案。


AMD((Asynchromous Module Definition)

AMD 是 RequireJS 在推廣過程中對模組定義的規範化產出

AMD非同步載入模組。它的模組支援物件 函式 構造器 字串 JSON等各種型別的模組。

適用AMD規範適用define方法定義模組。

//通過陣列引入依賴 ,回撥函式通過形參傳入依賴   依賴注入
define(['someModule1', ‘someModule2’], function (someModule1, someModule2) {

function foo () {
  // someing
  someModule1.test();
}

  return {foo: foo}
});
AMD規範允許輸出模組相容CommonJS規範,這時define方法如下:

define(function (require, exports, module) {

var reqModule = require("./someModule");
requModule.test();

exports.asplode = function () {
//someing
}
});

 CMD

CMD是SeaJS 在推廣過程中對模組定義的規範化產出

CMD和AMD的區別有以下幾點:

1.對於依賴的模組AMD是提前執行,CMD是延遲執行。不過RequireJS從2.0開始,也改成可以延遲執行(根據寫法不同,處理方式不通過)。

2.CMD推崇依賴就近,AMD推崇依賴前置。
//AMD
define(['./a','./b'], function (a, b) {

  //依賴一開始就寫好
  a.test();
  b.test();
});

//CMD
define(function (requie, exports, module) {

  //依賴可以就近書寫
  var a = require('./a');
  a.test();

  ...
  //軟依賴
  if (status) {

    var b = requie('./b');
    b.test();
  }
});
雖然 AMD也支援CMD寫法,但依賴前置是官方文件的預設模組定義寫法。

3.AMD的api預設是一個當多個用,CMD嚴格的區分推崇職責單一。例如:AMD裡require分全域性的和區域性的。CMD裡面沒有全域性的 require,提供 seajs.use()來實現模組系統的載入啟動。CMD裡每個API都簡單純粹。

相關文章