CommandJS AMD CMD读书笔记

1.规范

CommandJS规范要求每个文件都是一个模块,有自己的作用域。在一个文件里面定义的变量、函数、类都是私有的,对其他文件不可见。
而如果要调用每个模块,可以设置为global的属性,但是并不可取。
所以规范规定module为模块本身,module.exports为模块的对外接口,加载模块。

1
2
3
4
5
6
var x = 5;
var addX = function (value) {
return value + x;
};
module.exports.x = x;
module.exports.addX = addX;

require用于加载模块。

1
2
3
4
var example = require('./example.js');
console.log(example.x); // 5
console.log(example.addX(1)); // 6

所有代码都运行在模块作用域,不会污染全局作用域。
模块可以多次加载,但是只会在第一次加载时运行一次,然后运行结果就被缓存了,以后再加载,就直接读取缓存结果。要想让模块再次运行,必须清除缓存。
模块加载的顺序,按照其在代码中出现的顺序。

AMD

为什么要用AMD规范?因为CommendJS规范开始作用于服务器端,是同步的。但是如果需要在浏览器端请求模块化的代码,就不能使用同步的。所以出现了AMD规范。通过回调函数异步加载模块。被依赖的模块在依赖模块前加载。

1
var example = require(['Math'],function(Math){});

衍生出了require.js以及curl.js

CMD

代表为sea.js。

1
define()

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

区别

AMD与CMD都用与浏览器端,但是AMD是提前执行,CMD是延迟执行。
AMD推崇依赖前置,CMD推崇依赖就近。
AMD的API一个多用,CMD分的更为清楚