AMD
是Asynchronous Module Definition
的缩写,意思就是异步模块定义
。从名称上就可以看出,它是通过异步方式加载模块的,模块的加载不影响后续语句的执行,所有依赖加载中的模块的语句,都会放在一个回调函数中,等到该模块加载完成后,这个回调函数才运行,AMD规范的API非常简单:
AMD
定义了一个define
函数,它用来定义一个模块。它包含三个参数,前两个参数都是可选的:
id
:是一个string
字符串,它表示模块的标识(也就是模块的路径,通过id
才能知道从什么位置去加载依赖的模块)dependencies
:是一个数组,成员是依赖模块的id
factory
:是一个回调函数,在依赖的模块加载成功后,会执行这个回调函数,它的参数是所有依赖模块的引用,如果回调函数有返回值,会导出出来
一个完整的模块定义包含模块名称,模块的依赖和回调函数,比如下面的代码:
如果这个模块并没有依赖,那么默认的依赖是[“require”, “exports”, “module”],这时模块可以改写为:
如果省略第一个参数,则会定义一个匿名模块,见代码:
在实际中,使用的更多的是匿名模块定义方式,因为这样更加的灵活,模块的标识和它的源代码不再相关,开发人员可以把这个模块放在任意的位置而不需要修改代码。一般只有在要使用工具打包模块到一个文件中时,才会声明第一个参数,所以应该尽量避免给模块命名。
在写模块的时候,也有可能没有依赖或者稍后才需要加载依赖,也就是说我们可以省略第一个和第二个参数,下面代码展示了这种用法,这也是CommonJS的写法,算是一种兼容
: