dojo1.4的时候,我还在dojo.provide,dojo.delare来声明一个新module。从dojo1.7开始,dojo开始使用Asynchronous Module Definition (AMD)来声明一个新module.node
dojo1.7以前编程
dojo.provide("my._TemplatedWidget"); dojo.require("dijit._WidgetBase"); dojo.require("dijit._TemplatedMixin"); dojo.declare("my._TemplatedWidget", [ dijit._WidgetBase, dijit._TemplatedMixin ], {});
dojo1.7以后
define([ "dojo/_base/declare", "dijit/_WidgetBase", "dijit/_TemplatedMixin" ], function(declare, _WidgetBase, _TemplatedMixin){ return declare([ _WidgetBase, _TemplatedMixin ], {}); });
第二种方法好像少了module的名字,而不是像之前那样子declare("my._TemplatedWidget",[ _WidgetBase, _TemplatedMixin ], {})。其实,名字已经不重要了,在dojo1.7中,重要的是获取module。为何dojo1.7以后已经不重视module的名字了呢?后面我会讲到。
在1.7以前,每次想动态的加载一些module,能够用dojo.require,1.7以后,能够用新的require方法。设计模式
dojo1.7以前安全
dojo.require("dojo.dom"); dojo.require("dojo.fx") dojo.addOnLoad(function(){ // The piece we had before… var greeting = dojo.dom.byId("greeting"); greeting.innerHTML += " from Dojo!"; // …but now, with a fun animation! dojo.fx.slideTo({ top: 100, left: 200, node: greeting }).play(); });
dojo1.7以后dom
require(["dojo/dom", "dojo/fx", "dojo/domReady!"], function(dom, fx){ // The piece we had before… var greeting = dom.byId("greeting"); greeting.innerHTML += " from Dojo!"; // …but now, with a fun animation! fx.slideTo({ top: 100, left: 200, node: greeting }).play(); });
从上面的例子能够看出,dojo.require所须要的module都放入了define或require中的【】中了。这中新的设计模式被称为AMD。
dojo1.7之后几乎不再须要相似以"."来链接的类名了。而是能够将全部的代码放入callback函数,而后使用require([dependencies], callback)的形式来执行。callback里面再也没有长名字了,均可以使用module的local名字。异步
从以上例子能够看出,dojo自1.7之后,引入了Namespace和module相似的模式。类的名字已经再也不重要,重要的是module的文件地址。module以文件地址做为namespace,主要为了能经过http寻找到module的地址并引入。这样就避免了1.7以前须要维护module名与文件结构所带来的混乱。1.7以后,只维护module的文件地址。回到上面的问题,为何declare([ _WidgetBase, _TemplatedMixin ], {})再也不给类赋名了呢?看下面例子:ide
require(["my/_TemplateWidget"], function(MyTemplate){ var instance = new MyTemplate(); });
使用module地址来引入module,而后将里面定义的class赋予MyTemplate本地变量,在callback函数中只须要使用本地变量名就能够了。
Require的参数dependencies里面包含两类,一类是真正的依赖的类,另外一类是插件。好比["dojo/dom", "dojo/fx", "dojo/domReady!"],dojo/domReady就属于插件,意思是当dom解析完毕之后再执行callback。对于依赖,若是不存在,dojo回去加载。当加载完成以后,将执行callback函数。函数
以上介绍了AMD中的MD部分,A还没说。1.7以前的dojo.require使用的是同步XHR来获取js的,拿到的js内容使用eval函数,使js文本编程真正的js,同步XHR会block全部的js执行,可见效率多么的低。而1.7以后的require是使用重建<script>的方法来加载须要的js文件的,在script上注册"load"事件的监听。可见其是异步的,而且少了eval,效率提升了不少。综合起来,就成了AMD。ui
不管dojo.require仍是require,都须要对散文件发送http请求。建议对经常使用的module进行压缩,使用dojo的build system把用的全部module都压缩到一个dojo.compressed.js文件中。一次请求得到多有的module。spa
AMD的风格带来的好处
1,异步加载,安全和效率均提升
2,代码干净,风格统一,不用再见到不少的dojo.xhrPost, dojo.io.iframe, dijit.Menu.
3,提供插件的功能,简化一些事件的处理。
。。。应该还有,想不起来。