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
CMD 是seajs
推崇的規範,CMD
則是依賴就近,用的時候再require
define(function(require, exports, module) { var clock = require('clock'); clock.start(); });
這裡具體到使用的時候再來決定載入哪些檔案,AMD CMD都是非同步載入.
總結:CommonJs主要針對服務端,AMD/CMD主要針對瀏覽器端,所以最容易混淆的是AMD/CMD。(順便提一下,針對伺服器端和針對瀏覽器端有什麼本質的區別呢?伺服器端一般採用同步載入檔案,也就是說需要某個模組,伺服器端便停下來,等待它載入再執行。這裡如果有其他後端語言,如java,經驗的‘玩家’應該更容易理解。而瀏覽器端要保證效率,需要採用非同步載入,這就需要一個預處理,提前將所需要的模組檔案並行載入好。)
AMD
和CMD
最大的區別是對依賴模組的執行時機處理不同,而不是載入的時機或者方式不同,二者皆為非同步載入模組。AMD
依賴前置,js
可以方便知道依賴模組是誰,立即載入;而CMD
就近依賴,需要使用把模組變為字串解析一遍才知道依賴了那些模組