这几天在学习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模块化