1、CommonJS 主要是用于服务器端的规范,好比目前的nodeJS.javascript
根据CommonJS规范,一个单独的文件就是一个模块。每个模块都是一个单独的做用域,也就是说,在一个文件定义的变量(还包括函数和类),都是私有的,对其余文件是不可见的。html
// foo.js var request = require('request').default({ timeout: 4000 }); module.exports = function(){ this.re = ''; this.req = function(url){ request(url,function(error,status,res){ this.re = res; }); } }; //--------------------------------------------- // main.js var Foo = require('./foo'); var foo = new Foo(); foo.req('http://www.baidu.com'); //这么个异步法 foo.re应该是空的吧.. console.log(foo.re);
CommonJS 加载模块是同步的.因此只有加载完成才能执行后面的操做。java
像Node.js主要用于服务器的编程,加载的模块文件通常都已经存在本地硬盘,因此加载起来比较快,不用考虑异步加载的方式,因此CommonJS规范比较适用。node
但若是是浏览器环境,要从服务器加载模块,这是就必须采用异步模式。因此就有了 AMD CMD 等解决方案。git
2、AMD (Asynchromous Module Definition)github
AMD 是 RequireJS 在推广过程当中对模块定义的规范化产出编程
AMD异步加载模块。它的模块支持对象 函数 构造器 字符串 JSON等各类类型的模块。api
适用AMD规范适用define方法定义模块。浏览器
示例如-->服务器
AMD 运行时核心思想是「Early Executing」,也就是提早执行依赖
3、CMD (Common Module Definition)
CMD是SeaJS 在推广过程当中对模块定义的规范化产出
CMD和AMD的区别有如下几点:
1.对于依赖的模块AMD是提早执行,CMD是延迟执行。
2.CMD推崇依赖就近,按需加载;AMD推崇依赖前置。
“
定位有差别。RequireJS 想成为浏览器端的模块加载器,同时也想成为 Rhino / Node 等环境的模块加载器。Sea.js 则专一于 Web 浏览器端,同时经过 Node 扩展的方式能够很方便跑在 Node 环境中。
遵循的规范不一样。RequireJS 遵循 AMD(异步模块定义)规范,Sea.js 遵循 CMD (通用模块定义)规范。规范的不一样,致使了二者 API 不一样。Sea.js 更贴近 CommonJS Modules/1.1 和 Node Modules 规范。
推广理念有差别。RequireJS 在尝试让第三方类库修改自身来支持 RequireJS,目前只有少数社区采纳。Sea.js 不强推,采用自主封装的方式来“海纳百川”,目前已有较成熟的封装策略。
对开发调试的支持有差别。Sea.js 很是关注代码的开发调试,有 nocache、debug 等用于调试的插件。RequireJS 无这方面的明显支持。
插件机制不一样。RequireJS 采起的是在源码中预留接口的形式,插件类型比较单一。Sea.js 采起的是通用事件机制,插件类型更丰富。
总之,若是说 RequireJS 是 Prototype 类库的话,则 Sea.js 致力于成为 jQuery 类库。
”
4、UMD
umd是AMD和CommonJS的糅合
AMD 浏览器第一的原则发展 异步加载模块。
CommonJS 模块以服务器第一原则发展,选择同步加载,它的模块无需包装(unwrapped modules)。
这迫令人们又想出另外一个更通用的模式UMD (Universal Module Definition)。但愿解决跨平台的解决方案。
UMD先判断是否支持Node.js的模块(exports)是否存在,存在则使用Node.js模块模式。
在判断是否支持AMD(define是否存在),存在则使用AMD方式加载模块。
如代码:
(function (window, factory) { if (typeof exports === 'object') { module.exports = factory(); } else if (typeof define === 'function' && define.amd) { define(factory); } else { window.eventUtil = factory(); } })(this, function () { //module ... });
参考:http://my.oschina.net/felumanman/blog/263330?p=1