2009年,美国程序员Ryan Dahl创造了node.js项目,将javascript语言用于服务器端编程。这标志"Javascript模块化编程"正式诞生。
在CommonJS中,有一个全局方法require()用于加载模块,如数学模块math.js var math = require("math"); math.add(2,3);// 5
这种方式加载模块在浏览器环境有严重问题,就是代码在require()处阻塞,模块都放在服务器端,可能阻塞很长时间,取决于网络环境。但对服务器端不是问题,因为模块都在服务器本地,可以同步加载,只需等待硬盘读取时间
因此,浏览器端的模块,不能使用同步加载,需要异步加载,AMD应运而生
AMD全称Asynchronous Module Definition,即异步模块定义,采用异步方式加载模块,模块的加载不影响后面语句的执行, 所有依赖这个模块的语句,都定义在一个回调函数中,等到加载完成之后,回调函数才会执行
AMD也采用require(),但需要两个参数require([module],callback),第一个参数是数据,里面放入要加载的模块,第二个参数是加载成功后的回调函数
require(["math"],function(math){math.add(2,3)});
math加载与math.add()不是同步的,浏览器不会假死,更适合浏览器环境
require.js加载的模块,采用AMD规范。也就是说,模块必须按照AMD的规定来写。具体来说,就是模块必须采用特定的define()函数来定义。如果一个模块不依赖其他模块,那么可以直接定义在define()函数之中。
例如math.js模块:
// math.js
define(function (){
var add = function (x,y){
return x+y;
};
return {
add: add
};
});
如果这个模块还依赖其他模块,那么define()函数的第一个参数,必须是一个数组,指明该模块的依赖性。
define(['myLib'], function(myLib){
function foo(){
myLib.doSomething();
}
return {
foo : foo
};
});