1. 程式人生 > >AMD、CMD和CommonJS規範

AMD、CMD和CommonJS規範

 CommonJS規範

 CommonJS是在瀏覽器環境之外構建JavaScript生態系統為目標產生的專案,比如伺服器和桌面環境中。CommonJS規範是為了解決JavaScript的作用域問題而定義的模組形式, 可以使每個模組在它自身的名稱空間中執行。該規範的主要內容是:模組必須通過  module.exports匯出對外的變數或介面,通過require()來匯入其他模組的輸出到當前模組。 例子:
// moduleA.js
module.exports = function( value ){
    return value * 2;
}

// moduleB.js
var multiplyBy2 = require('./moduleA');
var result = multiplyBy2(4);

CommonJS是同步載入模組,但其實也有瀏覽器端的實現,其原理是將所有模組都定義好並通過id進行索引,這樣就可以瀏覽器進行解析了

 伺服器端的Node.js遵循CommonJS規範。核心思想是允許模組通過require 方法來同步載入所要依賴的其他模組,然後通過 exports或module.exports來匯出需要暴露的介面。
  
require("module");
require("../file.js");
exports.doStuff = function() {};
module.exports = someValue;

優點:
  •  伺服器端便於重用
  • NPM中已經將近20w個模組包
  • 簡單並容易使用
缺點: AMD規範其實只有一個主要介面 define(id,dependencies,factory),它要在宣告模組的時候指定所有的依賴dependencies,並且還要當做形參傳到factory中,對於依賴的模組提前執行,依賴前置
define("module", ["dep1", "dep2"], function(d1, d2) {
  return someExportedValue;
});
require(["module", "../file"], function(module, file) { /* ... */ });
優點:
  • 適合在瀏覽器環境非同步載入
  • 並行載入多個模組
缺點: CMD規範和AMD相似,儘量保持簡單,並且與CommonJS和NodeJS的Modules規範保持了很大的相容性。
define(function(require, exports, module) {
  var $ = require('jquery');
  var Spinning = require('./spinning');
  exports.doSomething = ...
  module.exports = ...
})

優點:
  • 依賴就近,延遲執行
  • 很容易在node中執行
缺點:
  • 依賴SPM打包,模組的載入邏輯偏重
實現: SeaJS