1. 程式人生 > >CommonJS, AMD, CMD 筆記

CommonJS, AMD, CMD 筆記

1.CommonJS 

根據CommonJS規範,一個單獨的檔案就是一個模組。載入模組使用require方法,該方法讀取一個檔案並執行,最後返回檔案內部的exports物件。所以,定義一個模組就是寫一個新的js檔案,但是最後要將檔案的內容exports出來。接下來我們看一下如何定義模組和載入模組。

//module1.js
exports.foo = function () {
  console.log('this is module1 foo');  
}

//main.js
let module1 = require('./module1');

module1.foo();

如上程式碼,定義module1模組檔案  在主入口引入 並呼叫方法,exports也可以換成module.exports 兩者關係是前者引用後者,最終匯出的函式 變數等等都是以module.exports為準,當然 exports=2這種修改是不起作用的。

nodejs 用的就是CommonJS規範.

2.AMD

AMD是"Asynchronous Module Definition"的縮寫,意思就是"非同步模組定義"。它採用非同步方式載入模組,模組的載入不影響它後面語句的執行。所有依賴這個模組的語句,都定義在一個回撥函式中,等到載入完成之後,這個回撥函式才會執行。

AMD也採用require()語句載入模組,但是不同於CommonJS,它要求兩個引數:

  require([module], callback);

 

第一個引數[module],是一個數組,裡面的成員就是要載入的模組;第二個引數callback,則是載入成功之後的回撥函式。如果將前面的程式碼改寫成AMD形式,就是下面這樣:

require(['math'], function (math) {

    math.add(2, 3);

  });

看到這段程式碼就想起了angularJS,好像是angular1的時候有類似這樣的程式碼。

 3.CMD

CMDseajs推崇的規範,CMD則是依賴就近,用的時候再require

。它寫起來是這樣的:

define(function(require, exports, module) {
   var clock = require('clock');
   clock.start();
});

 

這裡具體到使用的時候再來決定載入哪些檔案,AMD  CMD都是非同步載入.

總結:CommonJs主要針對服務端,AMD/CMD主要針對瀏覽器端,所以最容易混淆的是AMD/CMD。(順便提一下,針對伺服器端和針對瀏覽器端有什麼本質的區別呢?伺服器端一般採用同步載入檔案,也就是說需要某個模組,伺服器端便停下來,等待它載入再執行。這裡如果有其他後端語言,如java,經驗的‘玩家’應該更容易理解。而瀏覽器端要保證效率,需要採用非同步載入,這就需要一個預處理,提前將所需要的模組檔案並行載入好。)

 

AMDCMD最大的區別是對依賴模組的執行時機處理不同,而不是載入的時機或者方式不同,二者皆為非同步載入模組。
AMD依賴前置,js可以方便知道依賴模組是誰,立即載入;而CMD就近依賴,需要使用把模組變為字串解析一遍才知道依賴了那些模組