CommonJs
随着js的不断发展,使得js可以运行在服务器中,node.js,然而服务器端得逻辑比客户端的复杂,按客户端以前的编程方式会死人的
以前是用一个变量定义运行的方法
依赖关系的引用是全局变量通过html脚本加载的
依赖关系非常弱,开发者需要知道正确的依赖顺序,例如,包含主干文件不能在jq文件之前引入
引入一个脚本需要额外的工具引入他的依赖项。
应运而生CommonJs标准,将js代码模块化,cjs中一个文件中定义一个模块,一个传输格式会捆绑一个文件的多个模块用于优化,cjs会计算文件的依赖项,知道文件正确的加载顺序,但是cjs只适合服务器端不适合浏览器,因为它是同步加载的,每次进入界面之前要先等文件加载完成非常的耗时,但为什么适合服务器呢,可能是因为每次启动的时候就先加载到磁盘里,应用的时候没有影响。
AMD
为了浏览器又在CommonJs的基础上生成了AMD标准,AMD将每个依赖定义一个id,清楚标明了每个依赖同时避免了全局变量乱用的问题,优于CommonJs的地方是AMD可以异步加载文件,允许设置一个方法作为模块的返回值,创建方法的时候特别有用。代表的应用是requireJs,requireJs是AMD的实现,用于引入管理js代码。
CMD
CMD支持懒加载,AMD的文件必须在开头声明好,而CMD的文件可以在用的时候再声明,requireJs2.0版本支持CMD的方式。
define(function(require,exports,module){
var Moudle1 = require("./moudel");
var ThisModule = function(){
//TODO ...
};
module.exports = ThisModule;
})
require是一个方法,通过模块的唯一标识符获取其他模块的接口
exports是一个属性,定义对外的返回接口
exports.do为返回的方法
exports.foo为返回的属性
module定义了模块的特性
module.id模块的id
module.url模块的url
module.exports模块的返回接口
module.dependencies模块的依赖项
在Html中的引入<script data-main="/assert/main.js" src="/lib/requireJs.js">,一般data-main是起始模块,在其中的相对路径就是这个模块文件的路径,再后面引入的模块的相对路径也是模块文件的路径,可以用baseUrl 设置所有模块的根路径,可以用urlArgs为文件后面加后缀,在清除文件缓存的时候有用
urlArgs: "bust=" + (new Date()).getTime()
参考