疑问:为何会出现CMD规范?为何会出现sea.js,它到底解决了什么问题?html
答案:CMD规范是国内发展起来的,和AMD规范相似,AMD规范有一个require.js的实现,CMD也有一个叫sea.js的实现,这就是他们出现的背景。api
至于解决了什么问题?咱们能够暂且认为他和AMD解决的问题是同样的, 1: 浏览器中js文件的异步加载,避免的js文件的阻塞问题 2: 定义了模块之间如何相互依赖,更好的维护文件代码。浏览器
这里就冒出了一个疑问?CMD规范和AMD规范的做用不是同样嘛,那他俩有什么区别呢?稍后详述bash
和AMD规范与require.js的关系同样,CMD是一个规范,sea.js是规范的具体实现。异步
//index.html: 引入sea.js和主入口文件main.js
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<script src="./sea.js"></script>
<script src="./main.js"></script>
</body>
</html>
复制代码
//main.js ,这里引入了三个模块文件,
seajs.use(['./lib/a.js', './lib/b.js', './lib/c.js'], function (a, b, c) {
console.log(a);//{name: 1}
console.log(b);//{name: 2}
console.log(c);//{name: 3}
});
复制代码
//定义模块文件
//a.js
define({
name: 1
});
//b.js
define({
name: 2
});
//c.js
define({
name: 3
});
复制代码
思想相似,解决的问题都同样, 都是异步加载模块,同时更好的定义了模块之间如何去依赖。函数
1: 模块定义都是采用define()方法,模块引入的api全部不一样,可是思想一致,第一个参数表示引入的模块路径,第二个参数是回调函数,表示全部模块所有加载完成之后,所调用的函数。性能
AMD规范:采用define去定义模块,采用require(['模块1','模块2'], function() {}) 去引入模块 CMD规范:采用define去定义模块,采用seajs.use('模块1','模块2'], fucntion () {}) 去引入模块ui
2: 模块加载的时机不一样spa
AMD规范:依赖前置:即在模块中引入其余模块时,必须提早声明好要引入的模块
//main.js模块
define(['./a', './b'], function(a, b) {
a.doSomething();
b.doSomething();
});
说明:
咱们分析一下上面的代码:
浏览器在加载main.js模块时,首先看到了声明了a.js和b.js模块,因此会首先加载这两个模块,加载完成之后,再执行回调函数中代码。
复制代码
CMD规范:依赖就近:即在模块中不须要提起声明要引入的模块,写代码哪里用到其余模块,就在哪里直接引入模块。
//main.js模块
define(function(require, exports, module) {
var a = require('./a')
a.doSomething()
var b = require('./b')
b.doSomething()
})
说明:
咱们再来分析一下用cmd规范实现的这段代码:
浏览器在加载main.js模块时,它会首先遍历整个文件中,而后找到全部带require关键字的代码,而且加载其对应的模块,因此相对于AMD规范直提早声明要引用的 模块(依赖前置)而言,
CMD规范 则须要 遍历 整个文件,才能够找到须要加载哪些模块 (这一步遍历整个文件找requuire关键字就牺牲了性能,带了方便就是书写的方便,
咱们不用考虑提早引入哪些模块,只须要直接写代码,而后写着写着,发现这段代码须要引入其余模块,而后直接在此处引入其余模块便可)
复制代码