1.CommonJS java
根据CommonJS规范,一个单独的文件就是一个模块。加载模块使用require方法,该方法读取一个文件并执行,最后返回文件内部的exports对象。因此,定义一个模块就是写一个新的js文件,可是最后要将文件的内容exports出来。接下来咱们看一下如何定义模块和加载模块。node
//module1.js exports.foo = function () { console.log('this is module1 foo'); } //main.js let module1 = require('./module1'); module1.foo();
如上代码,定义module1模块文件 在主入口引入 并调用方法,exports也能够换成module.exports 二者关系是前者引用后者,最终导出的函数 变量等等都是以module.exports为准,固然 exports=2这种修改是不起做用的。git
nodejs 用的就是CommonJS规范.github
2.AMD后端
AMD是"Asynchronous Module Definition"的缩写,意思就是"异步模块定义"。它采用异步方式加载模块,模块的加载不影响它后面语句的运行。全部依赖这个模块的语句,都定义在一个回调函数中,等到加载完成以后,这个回调函数才会运行。api
AMD也采用require()语句加载模块,可是不一样于CommonJS,它要求两个参数:数组
require([module], callback);
第一个参数[module],是一个数组,里面的成员就是要加载的模块;第二个参数callback,则是加载成功以后的回调函数。若是将前面的代码改写成AMD形式,就是下面这样:浏览器
require(['math'], function (math) {
math.add(2, 3); });
看到这段代码就想起了angularJS,好像是angular1的时候有相似这样的代码。服务器
3.CMD异步
CMD 是seajs
推崇的规范,CMD
则是依赖就近,用的时候再require
。它写起来是这样的:
define(function(require, exports, module) { var clock = require('clock'); clock.start(); });
这里具体到使用的时候再来决定加载哪些文件,AMD CMD都是异步加载.
总结:CommonJs主要针对服务端,AMD/CMD主要针对浏览器端,因此最容易混淆的是AMD/CMD。(顺便提一下,针对服务器端和针对浏览器端有什么本质的区别呢?服务器端通常采用同步加载文件,也就是说须要某个模块,服务器端便停下来,等待它加载再执行。这里若是有其余后端语言,如java,经验的‘玩家’应该更容易理解。而浏览器端要保证效率,须要采用异步加载,这就须要一个预处理,提早将所须要的模块文件并行加载好。)
AMD
和CMD
最大的区别是对依赖模块的执行时机处理不一样,而不是加载的时机或者方式不一样,两者皆为异步加载模块。AMD
依赖前置,js
能够方便知道依赖模块是谁,当即加载;而CMD
就近依赖,须要使用把模块变为字符串解析一遍才知道依赖了那些模块