随着JS模块化编程的发展,处理模块之间的依赖关系成为了维护的关键。javascript
AMD,CMD,CommonJS是目前最经常使用的三种模块化书写规范。java
CommonJS规范是诞生比较早的。Node.js(是一个Javascript运行环境(runtime))就采用了CommonJS。是这样加载模块:编程
// foo.js module.exports = function(x) { console.log(x); }; // main.js var foo = require("./foo"); foo("Hi");
这种写法适合服务端,由于在服务器读取模块都是在本地磁盘,加载速度很快。可是若是在客户端,加载模块的时候有可能出现“假死”情况。好比上面的例子中clock的调用必须等待clock.js请求成功,加载完毕。服务器
AMD,即 (Asynchronous Module Definition),这种规范是异步的加载模块,requireJs应用了这一规范。先定义全部依赖,而后在加载完成后的回调函数中执行:异步
require([module], callback);
用AMD写上一个模块:模块化
require(['clock'],function(clock){ clock.start(); });
AMD虽然实现了异步加载,可是开始就把全部依赖写出来是不符合书写的逻辑顺序的,能不能像commonJS那样用的时候再require,并且还支持异步加载后再执行呢?函数
CMD (Common Module Definition), 是seajs推崇的规范,CMD则是依赖就近,用的时候再require。它写起来是这样的:性能
define(function(require, exports, module) { var clock = require('clock'); clock.start(); });
AMD和CMD最大的区别是对依赖模块的执行时机处理不一样,而不是加载的时机或者方式不一样,两者皆为异步加载模块。
AMD依赖前置,js能够方便知道依赖模块是谁,当即加载;而CMD就近依赖,须要使用把模块变为字符串解析一遍才知道依赖了那些模块,这也是不少人诟病CMD的一点,牺牲性能来带来开发的便利性,实际上解析模块用的时间短到能够忽略。ui
做者:乘着风
连接:http://www.jianshu.com/p/09ffac7a3b2c
來源:简书
著做权归做者全部。商业转载请联系做者得到受权,非商业转载请注明出处。spa