你的位置:首页 > Java教程

[Java教程]关于 CommonJS AMD CMD UMD 规范的差异总结


一、CommonJS 主要是用于服务器端的规范,比如目前的nodeJS.

根据CommonJS规范,一个单独的文件就是一个模块。每一个模块都是一个单独的作用域,也就是说,在一个文件定义的变量(还包括函数和类),都是私有的,对其他文件是不可见的。

// foo.jsvar 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.jsvar Foo = require('./foo');var foo = new Foo();foo.req('http://www.baidu.com');//这么个异步法 foo.re应该是空的吧..console.log(foo.re);

CommonJS 加载模块是同步的.所以只有加载完成才能执行后面的操作。

像Node.js主要用于服务器的编程,加载的模块文件一般都已经存在本地硬盘,所以加载起来比较快,不用考虑异步加载的方式,所以CommonJS规范比较适用。

但如果是浏览器环境,要从服务器加载模块,这是就必须采用异步模式。所以就有了 AMD  CMD 等解决方案。

 

二、AMD (Asynchromous Module Definition)

AMD 是 RequireJS 在推广过程中对模块定义的规范化产出

AMD异步加载模块。它的模块支持对象 函数 构造器 字符串 JSON等各种类型的模块。

适用AMD规范适用define方法定义模块。

示例如-->

AMD 运行时核心思想是「Early Executing」,也就是提前执行依赖

 

三、CMD  (Common Module Definition)

CMD是SeaJS 在推广过程中对模块定义的规范化产出

示例如-->

CMD和AMD的区别有以下几点:

1.对于依赖的模块AMD是提前执行,CMD是延迟执行。

2.CMD推崇依赖就近,按需加载;AMD推崇依赖前置。

 

那seajs和requirejs的差别呢?

  1. 定位有差异。RequireJS 想成为浏览器端的模块加载器,同时也想成为 Rhino / Node 等环境的模块加载器。Sea.js 则专注于 Web 浏览器端,同时通过 Node 扩展的方式可以很方便跑在 Node 环境中。

  2. 遵循的规范不同。RequireJS 遵循 AMD(异步模块定义)规范,Sea.js 遵循 CMD (通用模块定义)规范。规范的不同,导致了两者 API 不同。Sea.js 更贴近 CommonJS Modules/1.1 和 Node Modules 规范。

  3. 推广理念有差异。RequireJS 在尝试让第三方类库修改自身来支持 RequireJS,目前只有少数社区采纳。Sea.js 不强推,采用自主封装的方式来“海纳百川”,目前已有较成熟的封装策略。

  4. 对开发调试的支持有差异。Sea.js 非常关注代码的开发调试,有 nocache、debug 等用于调试的插件。RequireJS 无这方面的明显支持。

  5. 插件机制不同。RequireJS 采取的是在源码中预留接口的形式,插件类型比较单一。Sea.js 采取的是通用事件机制,插件类型更丰富。

      总之,如果说 RequireJS 是 Prototype 类库的话,则 Sea.js 致力于成为 jQuery 类库。

 

四、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




去云南旅游必去景点去云南旅游要多少钱去云南旅游最佳路线去云南旅游最佳时间云南旅游线路报价桂林穿山公园到神龙水世界有多少公里?桂林穿山公园到神龙水世界怎么走? 广州塔蜡像馆项目介绍?五一去广州塔世界名人蜡像馆有什么好玩的? 广州塔蜡像馆五一去好玩吗?五一去广州塔世界名人蜡像馆怎么样? 桂林两江四湖到神龙水世界怎么走?桂林两江四湖到神龙水世界自驾路线? 华南植物园有禾雀花吗?华南植物园禾雀花开花时间? “南朝四百八十寺”首刹 古鸡鸣寺 肇庆禾雀花最佳观赏时间?肇庆盘古山禾雀花几月份最好看? 肇庆哪里有禾雀花?肇庆赏禾雀花的地方有哪些? 去韶山交通怎么样? 重庆十条采风摄影精选自驾线:湖广会馆 撒野湾景区有什么好吃的美食? 西安十大“约会胜地”推荐 环城公园 暑假去泰国要多少钱?哪里会不会很热? 马来西亚有哪些特产水果? 泰国曼谷有什么好玩的娱乐项目?泰式按摩怎么样? 暑假去泰国旅游好不好玩呢? IDT72V3650L7-5BBI Datasheet IDT72V3650L7-5BBI Datasheet IDT5V991A-5JGI8 Datasheet IDT5V991A-5JGI8 Datasheet IDT71V3559S75PFG8 Datasheet IDT71V3559S75PFG8 Datasheet 四平跟团香港2日游 四平跟团香港2日游 四平跟团香港2日游 齐齐哈尔到港澳5日游 齐齐哈尔到港澳5日游 齐齐哈尔到港澳5日游 武汉到香港三日游 武汉到香港三日游 武汉到香港三日游