翻译 - 【Dojo Tutorials】Modern Dojo
原文:Modern Dojo
你可能有段时间没有碰Dojo了,或者你想把你之前为Dojo1.6写的代码放在1.10上运行,但有不确定是否完好。你一直听到人们讲AMD与baseless,但不知道他们是什么,从何了解。这篇教程就是讲这些的。
开始
Dojo至版本1.7起有了重大转变,Dojo工具集转向了更现代的架构,Dojo1.10延续这条路。虽然向后兼容,为了利用Dojo1.10的优势,有些基本概念变了。这些概念是基于Dojo2.0的,目前已采用了这些概念,你可以确定走上了这条光明而漫长的道路。另外,为了使用高级功能(如dojo/on)你需要了解一些“现代”的概念。
在这教程中我将试图解释一些Dojo已经引入的新的概念。我将引用这些作为遗留的和现代的Dojo。我尽力去解释哪些东西改变了,以及其所以然。有些改变咋看起来也许会让人迷惑,它们都是为了让你编码更有效率,运行的更快,更好的利用JavaScript,让你的代码更好维护。我觉得还是值得花时间来理解现代Dojo的。
这篇教程不是专门讲版本迁移的,但是很多改变都知道你考虑,如果你已经熟悉Dojo的话。关于迁移的具体细节参考Dojo1到2的迁移指南。
你好,新世界
现代Dojo的一个核心概念就是全局命名空间害死人。有很多原因,但是在复杂的web应用中,全局命名空间很容易就会污染代码,尤其是当团队使用多个框架的时候。没有提交的危害还有基于安全考虑人们有意去修改全局命名空间。这意味着在现代Dojo中,如果你还在使用全局命名空间,应该立即停止,因为你在做错误的事情。为了向后兼容,有些组件尤其自己的命名空间,在新的开发不要再使用它们。
如果你发现自己在输入dojo.*或dijit.*或dojox.*,那就是有问题了。
这意味着那种使用老的Dojo的方式,包含一下dojo.js,然后引入一些模块,在代码使用dojo.something的日子远去了。
再次申明,“全局命名空间害死人,全局命名空间害死人,我再也不用,我再也不用了”。
另一个核心概念是异步比同步快,在旧的Dojo中dojo.Deferred的概念就有纯正的异步血统,但是在现代Dojo中,最好每件事都想着异步操作。
为了增强Dojo的模块化和利用上面讲到的概念,自版本1.7起Dojo采纳了CommonJS的模块定义,叫做异步模块定义,简称AMD。这意味着Dojo的模块加载器要重写,通过require与define函数。你可以在加载器参考指南中查看详情。这从根本改变了代码的结构。
接下来看个新旧风格对比的例子,旧:
1 dojo.ready(function() { 2 dojo.byId("helloworld").innerHTML = "Hello World!"; 3 });
现在写法:
1 require([ 2 "dojo/dom", 3 "dojo/domReady!" 4 ], function(dom) { 5 dom.byId("helloworld").innerHTML = "Hello new World!"; 6 });