为什么要使用模块化?
- Web应用的复杂度提高
- 避免命名污染
- 管理依赖
- 代码解耦, 提高代码的复用性
CMD、AMD、CommonJS 规范分别指什么?有哪些应用
- 模块的规范
为什么模块需要规范, 因为虽然有了模块, 我们可以方便的使用别人的代码, 但是有一个前提, 那就是大家必须以相同的方式编写模块, 否则就会乱套. 但是JavaScript模块还没有官方规范, 所以才产生了CommonJS, AMD这样的通用的模块规范 - CMD
Common Module Definition, 是SeaJS在推广过程中对模块定义的规范化产出。
CMD规范应用于浏览器环境 - AMD
Asynchronous Module Definition, 是RequireJS在推广过程中对模块定义的规范化产出。
它采用异步方式加载模块, 模块的加载不影响后面语句的运行, 所有依赖这个模块的语句, 都定义在一个回调函数中, 等加载完成后, 这个回调函数才会运行.
根据AMD规范, 我们可以使用define定义模块, 使用require调用模块.
//HTML
<script src="js/require.js" data-main="js/main"></script>
//模块的加载
require.config({
paths: {
"jquery": "jquery.min",
"underscore": "underscore.min",
"backbone": "backbone.min"
}
});
//或者使用baseUrl
require.config({
baseUrl: "js/lib",
paths: {
"jquery": "jquery.min",
"underscore": "underscore.min",
"backbone": "backbone.min"
}
});
//main.js
require(['jquery', 'underscore', 'backbone'], function ($, _, Backbone){
// some code here
});
//模块定义
define(['myLib'], function(myLib){
function foo(){
myLib.doSomething();
}
return {
foo : foo
};
});
AMD规范应用于浏览器环境
- CommonJS
不适用于浏览器环境, 因为模块是同步加载的, 浏览器环境的网速没有本地硬盘的加载速度快, 同步会导致浏览器假死
Node.js的模块系统, 就是参照CommonJS规范实现的. 在CommonJS中, 有一个全局的方法require(), 用于加载模块.
CommonJS应用于服务端环境 - AMD与CMD
- 执行
AMD:提前执行(异步加载:依赖先执行)+延迟执行
CMD:延迟执行(运行到需加载,根据顺序执行) - CMD 推崇依赖就近,AMD 推崇依赖前置
- 执行
网友评论