CommonJS

一种服务器端模块化的规范,Nodejs实现了这种规范,所以就说Nodejs支持CommonJS。

CommonJS分为三部分:
require 模块加载
exports 模块导出
module 模块本身

根据规范一个单独的JS文件就是一个module,每个单独的module是一个单独的作用域。也就是说在一个文件里定义的变量和函数都是私有,对其他文件不可见,除非用exports导出了。


AMD

Asynchronous Module Definition 的缩写,意思是异步模块定义,是一种异步模块加载的规范,主要用于浏览器端的JS加载,为了不造成网络阻塞。只有当依赖的模块加载完毕,才会执行回调。

AMD使用define来定义模块,require来加载模块。
define(id?,dependencies?,factory);
require([module],callback);

Note: AMD允许输出的模块兼容CommonJS。

RequireJS是AMD的一种实现。


CMD

Common Module Definition的缩写,也是一种异步模块定义规范,它和AMD的主要区别有两点:
1.对于模块的依赖,AMD是提前执行,CMD是延时执行。
2.AMD推崇依赖前置,CMD推崇就近依赖。

//AMD
define(['./a','./b'], function (a, b) { //依赖一开始就写好
a.test();
b.test();
}); //CMD
define(function (requie, exports, module) { //依赖就近书写
var a = require('./a');
a.test();
});

当然还其他区别这里就不详细讲了。

SeaJS是CMD的一种实现。


UMD

Universal Module Definition。从名字就可以看出来UMD做的是大一统的工作,把前后端加载糅合在了一起,提供了一个前后端统一的解决方案。支持AMD和CommonJS模式。

UMD的实现很简单:

1.先判断是否支持Node.js模块格式(exports是否存在),存在则使用Node.js模块格式。
2.再判断是否支持AMD(define是否存在),存在则使用AMD方式加载模块。
3.前两个都不存在,则将模块公开到全局(window或global)。

各种具体的实现方式,可以查看UMD的github。下面是Jquery的例子

// if the module has no dependencies, the above pattern can be simplified to
(function (root, factory) {
if (typeof define === 'function' && define.amd) {
// AMD. Register as an anonymous module.
define([], factory);
} else if (typeof exports === 'object') {
// Node. Does not work with strict CommonJS, but
// only CommonJS-like environments that support module.exports,
// like Node.
module.exports = factory();
} else {
// Browser globals (root is window)
root.returnExports = factory();
}
}(this, function () { // Just return a value to define the module export.
// This example returns an object, but the module
// can return a function as the exported value.
return {};
}));

最新文章

  1. [OFC]Mellanox发布首个200Gb/s硅光子设备
  2. BZOJ 2820: YY的GCD [莫比乌斯反演]【学习笔记】
  3. context上下文 php版解释
  4. window下在同一台机器上安装多个版本jdk,修改环境变量不生效问题处理办法
  5. ACM/ICPC 之 简单DP-记忆化搜索与递推(POJ1088-滑雪)
  6. mysql时间格式化,按时间段查询MYSQL语句
  7. Axapta 3 COM Connector
  8. CodeForces 651C Watchmen map
  9. Silverlight IIs发布问题
  10. 复习linq
  11. [转]hibernate主键生成策略
  12. 2015 QQ最新登录算法
  13. HDU - 1045 Fire Net(搜索)
  14. 一些LVS实验配置、工具和方案
  15. Linux的sleep()和usleep()
  16. Date类的使用
  17. DB2隔离级别之RR/RS/CS/UR
  18. MacBook使用笔记2 - 安装windows虚拟机攻略
  19. java访问权限表
  20. 怎么把html页面中共用的底部代码做成共享模块

热门文章

  1. 【Docker 命令】 - search 命令
  2. 【Redis】- 总结精讲
  3. WCF面试精典题汇总
  4. 第20天:京东nav、footer部分制作
  5. sqlserver修改sa密码(在windows登陆没有权限的情况下)
  6. 【刷题】BZOJ 1002 [FJOI2007]轮状病毒
  7. SPOJ8222/NSUBSTR:Substrings——题解
  8. 虚拟机网络连接模式中桥接模式和NAT模式的区别
  9. Jsp电子商务之七 订单篇2
  10. 使用py-faster-rcnn训练VOC2007数据集时遇到问题