AMD 规范和 CommonJS
以同样的方式编写模块,就可以更方便地使用别人的代码,想要什么功能,就加载什么模块。
CommonJS
node.js的模块系统,就是参照CommonJS规范实现的。在CommonJS中,有一个全局性方法require(),用于加载模块。假定有一个数学模块math.js,就可以像下面这样加载。
1 | var math = require('math'); |
然后,就可以调用模块提供的方法:
1 | var math = require('math'); |
主要适用于 node 环境
AMD
AMD 是 “Asynchronous Module Definition” 的缩写,意思就是”异步模块定义”。它采用异步方式加载模块,模块的加载不影响它后面语句的运行。所有依赖这个模块的语句,都定义在一个回调函数中,等到加载完成之后,这个回调函数才会运行。
AMD 也采用 require()
语句加载模块,但是不同于 CommonJS ,它要求两个参数:
1 | require([module], callback); |
第一个参数 [module],是一个数组,里面的成员就是要加载的模块;第二个参数 callback,则是加载成功之后的回调函数。如果将前面的代码改写成AMD形式,就是下面这样:
1 | require(['math'], function (math) { |
math.add()与math模块加载不是同步的,浏览器不会发生假死。所以很显然,AMD比较适合浏览器环境。
目前,主要有两个Javascript库实现了AMD规范:require.js和curl.js。
按照AMD的规定,模块必须采用特定的define()函数来定义
1 | // math.js |
如 Zepto 只使用了 AMD 规范
1 | /* Zepto v1.2.0 - zepto event ajax form ie - zeptojs.com/license */ |
只使用了 AMD 规范的模块导出方法 define,没有用 CommonJs 规范的方法 module.exports 来导出模块
CMD
SeaJS 的 CMD 规范,与 AMD 非常类似,是国人开发的。