CommonJS,AMD,RequireJS的差異


RequireJS實現了AMD的API.node

CommonJS是使用exports對象來定義模塊的一種方法,它定義了模塊的內容。簡單地實現一個CommonJS的定義就像如下這樣:瀏覽器

// someModule.js異步

exports.doSomething = function() { return "foo"; };函數

//otherModule.jspost

var someModule = require('someModule'); // in the vein of node    ui

exports.doSomethingElse = function() { return someModule.doSomething() + "bar"; };spa

基本上CommonJS明白了你需要有一個require函數來獲取依賴,exports變量來輸出模塊的內容和一些用來獲取依賴的模塊標識符。設計

CommonJS有多種實現。比方Node.js.對象

因爲CommonJS設計的時候沒有考慮瀏覽器,因此它不適合瀏覽器環境(我事實上對這個不明白,但是這樣的說法處處都有,比方RequireJS官網)。因此咱們得作一些工做來實現異步載入。ip

相反,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"; };

});

相關文章
相關標籤/搜索