彻底理解AMD和CMD

640?wx_fmt=png

一个模块就是实现特定功能的文件,有了模块,我们就可以更方便地使用别人的代码,想要什么功能,就加载什么模块。模块开发需要遵循一定的规范,各行其是就都乱套了。

AMD

AMD 规范是 CommonJS 模块规范的一个延伸,它的模块定义如下:

define(id?, dependencies?, factory);


它的模块 id 和依赖是可选的,与Node模块相似的地方在于 factory 的内容就是实际代码的内容。


下面是在 Node 是使用 AMD 规范的例子,该例子使用了第三方库 requirejs

// a.js	
define(function() {	
  return 'hello world'	
});
// b.js	
define(['a'], function(data) {	
  let exports = {}	
  exports.sayHello = function () {	
    console.log(data)	
  }	
  return exports	
});
// index.js	
const requirejs = require('requirejs');	
requirejs.config({	
  nodeRequire: require	
});	
requirejs(['b'], function (obj) {	
  obj.sayHello()	
});


与 commonJS 不同之处在于,AMD 模块需要用 define 来明确定义一个模块,而在 Node 实现中是隐式包装的,它们的目的是进行作用域隔离,仅在需要的时候被引入,避免掉过去那种通过全局变量或者全局命名空间的方式,以免变量污染和不小心被修改。另一个区别则是内容需要通过返回的方式实现导出。

CMD

CMD规范由国内的玉伯提出,与AMD规范的主要区别在于定义模块和依赖引入的部分。AMD需要在声明模块的时候指定所有的依赖(依赖前置),通过形参传递依赖到模块内容中:

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


与AMD模块规范相比,CMD模块更接近于Node对CommonJS规范的定义,在依赖部分,CMD支持动态引入(就近依赖),示例如下。


下面是在 Node 是使用 CMD 规范的例子,该例子使用了第三方库 seajs

// a.js	
define(function() {	
  return 'hello world'	
});
// b.js	
define(function(require) {	
  let data = require('./a')	
  let exports = {}	
  exports.sayHello = function () {	
    console.log(data)	
  }	
  return exports	
});
// index.js	
const seajs = require('seajs');	
let obj = require('./b')	
obj.sayHello()


AMD和CMD最大的区别是对依赖模块的执行时机处理不同。


define(function(require, exports, module) {	
// The module code goes here	
});

require 、 exports 和 module 通过形参传递给模块,在需要依赖模块时,随时调用 require() 引入即可。三个参数表示的意思和commonJS规范相同。


640?wx_fmt=png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值