AMD;Asynchrous Module Define 异步模块定义
Dojo 1,7 release也开始支持了AMD的module格式写法,这种写法使得代码编写起来更容易,也更容易debug。
为了兼容之前的Dojo,Dojo的loader默认会运行在Synchronous模式。要使用Asynchronously模式,需要进行一些配置,将async属性设置为true。
<script data-dojo-config="async: true" src="js/lib/dojo/dojo.js"></script>Dojo的require函数: require函数接受以下参数: 1,configuraton(可选参数,默认是undefined):这是一个object对象,这个对象是对loader的一些配置, 这些配置项允许在运行时重新配置loader。 2,dependencies(可选参数,default=[]):依赖的module的数组。如果指定了依赖的module,那么这些module会在代码解析之前resolved. 它们会按照指定的顺序load,并且按照这个顺序当做参数依次传到callback函数里。 3,callback函数:这个函数是你想依赖以上module“做的事情”,包装在这个函数里。 当require去加载依赖的module时,loader会解析这些module的代码,作为参数传给callback函数,分享给所有请求该模块的代码使用。 Dojo的define函数 define函数接受以下函数 1,moduleId (可选,默认是undefined): module标识符,不被提供。很大程度上是为了早起的AMD loader 或者是为了支持AMD之前的dojo. 2,dependencies (可选,default=[]): module依赖的数组,同required中的dependencies,不同的是,这些module若指定,则依次当做参数,传递到factory函数里,供起使用。 3,factory: 这个可能是一个值,这个值就是module,此时不可以指定依赖module.也可能是个factory函数,返回一些值。 注意:当定义一个module,factory函数只会被调用一次。返回值会被loader缓存。 模块的创建是懒惰和异步的,不会在调用define时立即运行。这个意思就是factory 不会被执行。并且依赖的模块也不会下载并解析。直到有运行的代码需要这个模块。 Loader的工作原理: 当调用require的时候: 1,解析依赖module的module标识符,链接baseURL与传入的module标识符(这个过程中会考虑其他配置项带来的必要的配置修改) 2,此时,loader有URL定位到实际的module定义文件。loader会创建一个script标签,url设置为解析出来的文件路径。 3,一旦这个module被加载进来,计算这个module,这个值作为这个module的值。 4,loader会记住到每个module的引用,一旦某个module再次被请求,直接返回这个引用。 当AMD的module被加载的时候,在新插入script标签到页面中,这会导致define函数被调用。以上同样的步骤会发生在define加载相关依赖module。loader对这个module的引用指向的时factory函数的返回值。 若factory不是函数,而是值,则loader指向的是这个值。