1. Javascript 先天缺乏模块的功能。在其他高级语言中,Java有类文件,Python有import机制,Ruby有require,PHP有include和require,而Javascript 则需要依靠<script>标签引入代码,当脚本多的时候,会显得杂乱无章。

2. 针对以上问题,CommonJS应运而生。CommonJS为Javascript制定了一个美好愿景:能够在任何地方运行!(Not just for browser), CommonJS希望弥补Javascript没有标准的缺陷(没有模块系统,标准库较少,没有标准接口,缺乏包管理系统),可以编写大型应用,如服务器端Javascript,命令行工具,桌面图形界面应用程序,混合应用等。

3. CommonJS规范涵盖:

模块、二进制Buffer, 字符集编码,I/O流,进程环境,文件系统,套接字,web服务器网管接口,包管理等。

4. Node.JS遵循CommonJS规范,推进了CommonJS的发展.

5. CommonJS主要是为了JS在后端的表现制定的,不适合前端。为什么这么说呢?

前后端Javascript分别被搁置在HTTP的两端,二者扮演的角色不同:



浏览器端Javascript

服务器端Javascript

代码的执行需要经历从同一服务器端分发到多个客户端执行相同代码需要多次执行

瓶颈

在于带宽

在于CPU和内存资源

代码加载方式

需要通过网络加载代码

从磁盘加载代码(二者速度不在一个数量级上)

6. 于是AMD出现了,Asynchronous Module Definition. 异步模块定义。

        它就主要为前端JS的表现制定规范

AMD规范只有一个API,其模块定义如下:

define(id?,dependencies?,factory); //id,dependencies可选,factory内容就是实际代码的内容

a. Id:模块标识,可以省略,这里的模块标识指的是自己,即整个文件。所以当id省略的时候,就相当于定义了一个匿名模块,这时候模块文件名就是 模块标识。e.g.模块文件放在a.js中,那么a就是模块名。

b.  dependencies: 依赖的模块。AMD规范要在声明模块的时候指定所有的依赖,并且还要当做形参传到factory里面。例如:

define(['dep1', 'dep2'], function ( dep1, dep2  ){ … });

 

一个不包含依赖关系的例子:

define(function(){

var exports = {};

exports.method = function(){ ...};

return exports;

...

});


c. define函数中不难想到define函数具有异步性。它在执行时首先会异步去调用第二个参数中列出的依赖模块,当所有模块被载入完成后,如果第三个参数是一个回调函数则执行。

d. Node.js中,没有看到define将模块包起来,是因为Node实现了隐式包装(即在对模块进行 编译时,node会对模块进行头尾包装,以隔离各个模块文件,防止变量污染)。

e. requireJS就是实现了AMD规范。


7. CMD规范由国内的玉伯提出,与AMD规范的区别在于定义模块和依赖引入的部分。风格更接近于Node.可以看看Sea.js