這幾天在學習CommonJS的時候忽然在StackOverflow上搜索到一個很是好的一個帖子,是關於CommonJS, AMD和RequireJS之間的關係的問答貼。我感受寫的很是好,鑑於沒有找到相關的中文文章,特地翻譯過來一下和你們分享一下。javascript
先說說CommonJShtml
CommonJS - 你們是否是以爲JavaScript僅僅是一個客戶端的編譯語言,其實JavaScript設計之初不只僅是針對客戶端設計的語言。後來只是因爲Web的迅速流行,加之Netscape和微軟之間之爭過早的將JavaScipt標準化。要了解詳細的JS歷史請查看:http://zh.wikipedia.org/zh-cn/JavaScript。過早的標準化JS就致使JS的諸多缺陷和標準類庫的缺少,即便這樣也不影響JS成爲一門優秀的編程語言(好比如今很是流行的Node.js)。目前JS僅僅包括基本的API,若是要做爲一個server端的編程語言,像IO, FS, i18n, package等等特性都沒有,CommonJS是一個組織,它讓JS能夠在共同的方向上作努力,來完善JS。儘可能Common JS如今尚未一個正式版發佈,可是不少方向的草案的實現都已經取得很好的成果。例如如今很是流行的Node.js。 java
再回到本文的主題來,CommonJS和AMD,RequireJS有什麼關係呢?原來CommonJS其中就有一個Modules規範,咱們都像JS如今這樣全部東西都寫在一個文件中來寫server端應用是一件很是困難的事情,它就是來解決JS沒有模塊化管理代碼的功能。關鍵部分就二個函數:node
CommonJS並無只是一個規範,就像Java中的Interface同樣,並無註明你應該怎麼實現。編程
問題在於CommonJS的這個Modules規範設計之初是爲了server端設計的,它是一個同步的模式。可是這種模式並不適合於瀏覽器端,你們設想一下若是瀏覽器同步模式一個一個加載模塊,那麼打開將會變得很是的慢,因此AMD就是爲了這個誕生,它最大的特色就是能夠異步的方式加載模塊,具體的不一樣在於AMD有一個define函數,它可讓當前模塊運行時先加載當前模塊所依賴的模塊,例如如下定義的意義就是在運行function時先加載依賴的module, dependency, array模塊。瀏覽器
define('module/id/string', ['module', 'dependency', 'array'], function(module, dependency, array) { return ModuleContents; });
因此說CommonJS Module和AMD都是JS模塊化定義的API,出自相同的起源的,就是可讓JS能夠模塊化加載。異步
那麼RequrieJS其實就是AMD如今用的最普遍,最流行的實現。在RequireJS網站上的介紹其實也有說明RequireJS誕生的緣由,只是當時我並無看懂。編程語言
RequireJS is a JavaScript file and module loader. It is optimized for in-browser use, but it can be used in other JavaScript environments, like Rhino and Node. Using a modular script loader like RequireJS will improve the speed and quality of your code.
從以上基本能夠看清CommonJS(泛指Modules規範),AMD和RequireJS以前的關係了。簡單的來說CommonJS Modules和AMD都是爲了解決JS模塊化的規範API,CommonJS更適合於Server端,而AMD基本是用於瀏覽器端(不過它也能夠用於Server端,好比Node loader的方向的努力:http://requirejs.org/docs/node.html),而RequireJS就是AMD最流行的實現。ide
原文地址在:http://stackoverflow.com/questions/16521471/relation-between-commonjs-amd-and-requirejs模塊化