JavaScript模塊化編程 - CommonJS, AMD 和 RequireJS之間的關系


這幾天在學習CommonJS的時候突然在StackOverflow上搜索到一個非常好的一個帖子,是關於CommonJS, AMD和RequireJS之間的關系的問答貼。我感覺寫的非常好,鑒於沒有找到相關的中文文章,特意翻譯過來一下和大家分享一下。

                                                                                        

先說說CommonJS

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。 

再回到本文的主題來,CommonJS和AMD,RequireJS有什么關系呢?原來CommonJS其中就有一個Modules規范,我們都像JS現在這樣所有東西都寫在一個文件中來寫server端應用是一件非常困難的事情,它就是來解決JS沒有模塊化管理代碼的功能。關鍵部分就二個函數:

  • require - 用來引入依賴
  • export - 用來導出模塊,包括標識符(identifier)和模塊內容(contents)

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最流行的實現。

原文地址在:http://stackoverflow.com/questions/16521471/relation-between-commonjs-amd-and-requirejs


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM