RequireJS實現了AMD的API.
CommonJS是使用exports對象來定義模塊的一種方法,它定義了模塊的內容。簡單地實現一個CommonJS的定義就像以下這樣:
// someModule.js
exports.doSomething = function() { return "foo"; };
//otherModule.js
var someModule = require('someModule'); // in the vein of node
exports.doSomethingElse = function() { return someModule.doSomething() + "bar"; };
基本上CommonJS明白了你須要有一個require函數來獲取依賴,exports變量來輸出模塊的內容和一些用來獲取依賴的模塊標識符。
CommonJS有多種實現。比方Node.js.
由於CommonJS設計的時候沒有考慮瀏覽器,所以它不適合瀏覽器環境(我事實上對這個不明白,可是這樣的說法到處都有,比方RequireJS官網)。所以我們得做一些工作來實現異步載入。
相反,RequireJS實現了AMD。它被設計用來適應瀏覽器環境。表面上看來,AMD開始是CommonJS輸出格式的副產品,並且終於進化出了自己的API。
在AMD中出現的新東西是define函數。它同意模塊在載入依賴之前聲明它的依賴。比如定義可能就像以下這樣:
define('module/id/string', ['module', 'dependency', 'array'],
function(module, factory function) {
return ModuleContents;
});
因此CommonJS和AMD是Javascript模塊定義API的不同的實現。可是他們有同樣的根源。AMD更適合瀏覽器,由於它支持異步載入模塊依賴。RequireJS是AMD的一個實現,並且儘量保留了CommonJS的精神(主要是模塊標識符上)。
更讓人混亂的是,RequireJS在實現AMD的同一時候,還提供了一個CommonJS包裹,這樣CommonJS模塊能夠差點兒直接被RequireJS引入。
define(function(require, exports, module) {
var someModule = require('someModule'); // in the vein of node
exports.doSomethingElse = function() { return someModule.doSomething() + "bar"; };
});