用户要求现在的Web应用程序应该像桌面应用程序一样。家用计算机已经无处不在,而且Web浏览器是一个开放性平台,因此可以说几乎全世界的每个人都可能成为Web应用程序的终端用户。软件开发人员为创建基于浏览器的应用程序,要花上比过去多得多的时间,因为他们必须满足潜在的百万级用户群的需求——其中很多人手里掌握着数十亿美元的广告预算,而另外一些人则会利用应用程序优雅便捷的特性,吸引更多的人前来浏览访问。.
当然,就因为Web浏览器是开放性平台,并不意味着它是理想的平台——至少当前还不够理想。任何团体利益都不应该凌驾于对各种Web浏览器技术规范的统一实现之上。但让人难以理解的是,相关协议和标准在经历了近20年的发展后,反而导致在浏览器中部署应用程序变得更加困难。这种局面无论如何是任何人都不可能预知的。
但是,在一个拥有想像力和创造力的世界里,总还是有希望的。
幸运的是,JavaScript提供的丰富而强大的功能使得动态操作、定制和增强网页成为可能。而在此基础之上,为开发人员和Web浏览器的不兼容性之间捉供一个隔离层也成为了可能——即使是隔离所有的浏览器。
本书将要介绍的Dojo是一个JavaScript工具箱,它就为开发人员和浏览器的不兼容性之间提供了这样的一个隔离层。为此,Dojo结合了JavaScript和其他有效的Web技术——但是,它并非一个试图重新实现或解决浏览器问题的暂时的表层。无论是那些已经使用了YUI!(注1)的项目,还是因为把负载转移到了客户端而受益的服务器端框架,都能通过Dojo获得更多的特性。
Dojo内置了开发人员由衷期望的标准JavaScript库、大量常见的自定义HTML控件的替代物和CSS布局的高级解决方案,以及方便发布应用程序的构建工具和单元测试框架。Dojo不仅是一个JavaScript工具箱,而且是一个真正的JavaScript工具箱——现在正是学习如何通过它来解放自己并为用户提供各种体验的最佳时机。Dojo正发动Web开发的革命,也必将推动Web开发的迅猛发展。
无论你想实现什么样的Web开发项目,Dojo都能帮助你迅速地把它变为现实,并且保持最低的冗余代码。因此,你得到的将是一个最干净、最容易维护的项目。我最大的希望是读者能够通过本书以最少的时间领会Dojo的本质,并且能够充分利用它完成自己面对的艰巨任务。
为什么选Dojo
当然,目前可供选择的JavaScript工具箱有好几个,那么读者恐怕早就想问“为什么Dojo可以让我们别无所求”这个问题了。从理论上说,基于一门纯解释型语言构建的工具箱或库,它所能做到的事情其他工具箱或库也同样能够做到,很难说其他工具箱做不到的而Dojo能做到。但是,Dojo在它的社区支持、指导思想和许可方式等方面确有其独到之处。
也许读者可以这样来想:理论上,只要有一把锤子、一把铲子和足够的钉子就能够建起房子来,但是那要花多大代价呢?显然,在建房的过程中,如果有机械设备和木匠作伴,那么这个过程就完全不一样了。这个比喻对于Dojo同样适用。接下来,我们就尝试从以下几个方面介绍Dojo的闪光点和它的特征(先后顺序不代表重要性):
社区支持
虽然可以把这一条归结为非技术因素,但Dojo的开放性社区的确是它最大的优势。Dojo基金会作为一个非赢利组织,其设立宗旨是作为厂商中立的Dojo知识产权的监护人,是由IBM、AOL、Sun、OpenLaszlo、Nexaweb、SitePen、BEA、Renkoo和世界各地的DHTML黑客发起和支持的。该基金会资助了Dojo工具箱(以及其他值得关注的项目,如Cometd(注2)、DWR(注3)和Open-Record(注4))。如果这些还不能说明Dojo拥有的强大支持,那么还有什么可以说明呢?
Dojo作为一个自由许可的开源项目,加之其极低的加入门槛,任何人都可以在它的社区中发出自己的声音(如果愿意让别人听到的话)。如果登录IRC并进入freenode.net的#dojo聊天室说话,要想不让该项目的开发人员或参与者听到也是不太可能的。此外,每周一次的IRC会议目前会于每周三下午3点到6点(太平洋标准时间)在#dojo-meeting聊天室举行。这个正式的官方会议讨论的内容既有战略规划,也有战术分析。如果你在开会期间冒然闯进会议室,绝不会遭到拒绝。你可以在里边“偷听”,也可以大胆地主动发言。
能够了解Dojo在战略规划和战术落实方面的信息是非常有吸引力的。在其他JavaScript工具箱和库日益商品化的背景下,Dojo社区越来越显得独树一帜。无论是相关组织,还是开发团队中的一员(更不必说当前正在构建真实站点和应用程序的数千名开发人员),都能通过对Dojo献计献策为它将来的成功夯实基础。
自由(彻底的)许可
Dojo作为开源软件,任何人或组织都可以根据BSD(Berkeley Software Distribution,伯克利软件分发)许可修订版或者AFL(Academic Free License,自由研究许可)2.1版获得不受限制的许可。除了某些个别模块中包含的许可文件之外,开发人员可以根据自己的工作选择想要采用的许可方式。所有外部的参与者必须遵守BSD或AFL许可,所有参与者还必须签署CLA(Contributor License Agreement,贡献者许可协议),以确保Dojo基金会对所有衍生产品具有明确的权利,从而保护Dojo工具箱的所有用户免受知识产权纠纷的困扰。这种许可的彻底性与其他流行的JavaScript工具箱相比,具有明显的不同。
深度和广度
与某些工具箱专注于特定的问题领域不同,Dojo为基于浏览器的开发提供了端到端的解决方案。从标准的库方法到一应俱全的部件(widget),从构建工具到测试框架,无所不包;因此,可以说有了Dojo在手,基本上别无他求。但是,千万不要以为它覆盖面如此之广,代码肯定会臃肿不堪。因为使用构建工具可以生成它的自定义版本,并能够尽量保持应用程序许可的合理化。
虽然广度的增大一般会影响到深度,但这条经验性规则对Dojo却不适用。即使是在Base(为工具箱其他部分捉供基础的微小内核)中,都包含着几乎数不尽的功能,例如,基于CSS3选择符的通用DOM查询机制、Ajax实用方法、对浏览器间事件操作的规范化等。而这些甚至还没有涉及丰富的应用程序、表单库、布局部件或者构建工具。
尽管Dojo的广度和深度带来了不少复杂性,但是它的底层结构仍然由世界上最好的Web黑客在不断地用心改进。无论从代码标准的高质量、统一的命名约定,还是从性能和容易维护方面,都致力于让应用程序开发人员能够更方便地使用它。使用Dojo一定能够创造出引人入胜的用户体验。
.容易移植
JavaScript语言虽然拥有动态性、效率高和富有表达能力的特点,但在日常开发中仍然不可避免地会出现各种各样的问题。通过反复试验来解决某个核心算法问题或者厘清设计上的含糊性固然有益,但无论如何,你所开发的代码都将成为必须维护、升级、调试和说明的代码。
仅有这些理由似乎还不够。在当前不同浏览器支持的各种特性存在兼容性问题的形势下,需要一个JavaScript标准库则是比较有说服力的动机。当前,尽管开发一种可以在所有现代浏览器中运行的功能并非难于登天,但因此所要承受的痛苦和挫折,恐怕就连经验丰富的专业人士都要望而却步。
毕竟,作为一名应用程序开发人员,你并不会因为能解决所有这些问题而希求任何回报(也许会感觉比较好玩)。相反,你应该义无反顾地选择由整整一个社区的开发人员开发的、经过调试和验证的产品级代码——然后,再考虑对这个社区有所回馈。我们衷心希望,在享受到社区支持的开源软件带来的节省时间和金钱的好处之后,这个“回馈”部分最好是发自内心的。
实用哲学
Dojo与JavaScript的结合并不是把它当作一个需要救治的对象,并因此以几乎重新定义它的方式来创建的一个脆弱的人造层。尽管Dojo提供了大量避免开发人员直接与浏览器引擎交互的功能,并且在后台实现了标准化浏览器事件之类的机制,从而使开发人员不必重复工作,但是它却从未试图彻底改造JavaScript。例如,Dojo没有提供删除节点或遍历DOM树之类的方法,因为childNodes、firstChild,lastChild和removeChild在所有浏览器中都能正常使用。然而,针对任何已知的不一致性,Dojo都会为开发人员编写可移植的代码提供相应的工具。
在这个问题上,Dojo并没有尝试妨碍或限制开发人员使用其他JavaScript库。实际上,Dojo与其他技术(如DWR或YUI!)协同运行的案例并不鲜见。当然,作为一种客户端技术,Dojo的服务器无关性也可以让开发人员自由选择任何服务器端技术。
通过对流行JavaScript工具箱的全面对比可以发现,正是由于它们流行,所以它们相互之间存在大量的重叠功能。因此,在决定应该选用哪个工具箱或工具箱集合时,有必要把社区支持、透明性、许可方式和指导该项技术的哲学理念等因素考虑在内。也许这个选择不仅仅意味着时间的付出,甚至会意味着金钱的投入。换句话说,你希望在需要时能够得到支持(社区和文档),而不希望投资于一个脆弱得难以维护的项目,或者说一个封闭的项目。同时,你更希望利用既有工具箱提供的现成解决方案来最大限度地节省自己的开发时间。
本书内容
本书第一部分基本上是标准库的参考,详细介绍了组成Dojo工具箱中JavaSeript标准库的Base和Core的方方面面。Base通过网络传输(注5)时不到30KB,并且从速度、大小和实用性方面都进行了优化。其中封装的功能包括各种Ajax调用、基于CSS选择符语法的DOM查询、标准事件传播机制和函数式编程的实用程序(如map和filter)等。相信读者在接触Base后,很快就会有相见恨晚的感觉。Core中又包含了很多其他特性(如对动画和拖放的支持),这些特性都非常有用,只不过与Base中那些功能的通用性相比要稍差一些。
注意:本书将在第11章中介绍Dijit时再详细讨论解析器(parser),原因在于解析器最常见的用途是解析部件。由于解析器在实现拖放功能时也很有用,因此在第7章的附言栏”(sidebar)中将会先对它先进行简单介绍。
本书第一部分包含以下几章:
第1章Dojo工具箱概述
本章简单介绍Dojo工具箱的基本情况,包括Dojo的架构、如何获取和在页面中使用Dojo,以及展示Dojo实际应用的一些示例。
第2章语言及浏览器实用程序
本章对适用于任何Web应用程序的最为常见和实用的方法进行全面介绍。其中大部分方法主要针对消除浏览器的不兼容性问题而设计,另外一些方法是为JavaScript或DOM操作查漏补缺的,最后一些方法则有助于减少实际开发中的重复编码工作。
第3章事件侦听器及发布/预订通信
本章介绍在页面内部实现通信管理的机制。讨论的两个主要模式包括在DOM中、JavaScript对象上或者基于独立的函数连接发生的事件,和广播主题并允许任意预订程序接收及响应该主题的发布/预订模式。
第4章Ajax及服务器通信
本章围绕AJAX和Dojo工具箱中通过XMLHttpRequest对象与服务器通信的机制进行讨论。本章还讨论了Deferred对象,该对象为处理异步事件提供了统一的层;虽然JavaScript不支持线程,但在某种程度上却可以把Deferred想像成对线程的实现。另外,跨域JSON、远程过程调用以及IFRAME传输也是本章的主题。
第5章节点操作
本章主要介绍工具箱中使用CSS选择符语法来查询DOM的机制。而针对查询返回的节点列表,又可以基于事件连缀使用一组方便的内置方法。最后,讨论了一种分离DOM节点的行为与在HTML标记中定义的具体操作的模式。
第6章国际化(i18n)
本章结合示例介绍如何使用工具箱提供的实用程序,实现Web应用程序对国际化的支持。同时,也讨论了处理与国际化有自然关联的一些概念(例如,日期、时间、货币及数字的格式化)的方法。..
第7章拖放
本章提供一个基本独立的教程,展示方便地通过Dojo为应用程序添加拖放功能。
第8章动画和特效
本章同样是一个基本独立的教程,讲解使用Dojo创建基于CSS属性动画的内置机制,展示一些典型的动画效果,例如,擦除、滑动和淡入淡出。此外,还介绍与颜色混合等操作有关的实用方法。
第9章数据抽象
本章对Dojo提供的数据抽象架构进行讨论,该架构在应用程序逻辑与特定的后端数据格式之间提供了一个中间层,而且与数据格式遵循开放标准还是封闭专有无关。
第10章模拟类和继承
本章是对第二部分介绍Dijit的一个铺垫,介绍如何使用Dojo模仿面向对象编程中基于类的继承。而模拟类和继承在Dijit中得到了广泛应用。
第二部分系统地研究Dojo工具箱的其他组件,包括直接替换那些被编写(及重复编写)了很多次的定制化HTML控件的部件集合——Dijit的全面介绍。经过精心设计的Dijit可以由设计人员直接在标记中使用,而且对编程经验的要求极少,甚至为零。有了Dijit之后,只花片刻功夫就构建出令人侧目的页面是完全可能的。毕竟,所有部件的外观和行为都与桌面应用程序中的用户界面控件十分相似。
第二部分最后讨论Util中提供的构建工具和单元测试框架。其中,构建系统包含一个指向ShinkSafe的高度可配置的入口和一个利用Rhino JavaScript引擎压缩代码的工具——压缩幅度可达1/3甚至更多。单元测试框架DOH是Dojo Objective Harness(Dojo目标套件)的缩写,这个名字的灵感来源于Homer Simpson那句家喻户晓的感叹词“D'oh!”,它是对JavaScript代码进行单元测试的一个独立系统。
本书第二部分包含以下几章:
第11章Dijit概述
本章在介绍Dijit的同时,也讨论设计原理、易访问性、解析器(由Core提供的工具,但最常见的用途是解析包含部件的页面)和使用部件的模式。本章最后提供包含所有主要Dijit子项目的简介。
第12章深入理解Dijit及其生命周期
本章深入探讨Dijit部件在磁盘中的分布模式,同时对其实例化后在内存中的生命周期过程给出全面介绍。本章还围绕生命周期的关键点展示一些简短的示例。理解部件的生命周期是理解后续各章的基础。
第13章表单部件
本章首先对常规HTML表单进行简单回顾,然后展开对表单部件的全面介绍。表单部件是目前为止包含的继承关系最为丰富的一组部件。表单部件可以直接取代任何Web设计中常用的表单元素,主要包括按钮、专用的文本框和滑动条等。其他派生的元素还有下拉组合框等已经实现或重复实现了无数次的表单部件。
第14章布局部件
本章介绍布局部件,这些部件为那些经常需要各种技巧和大量CSS的复杂布局提供了骨架,包括能根据应用程序状态隐藏/可见或者变换布局模式的选项卡式部件等。
第15章应用程序部件
本章介绍工具箱中剩余的部件,这些部件大致能够与常见的应用程序控件对应起来,例如,提示条、模态对话框、菜单、树和富文本编辑器。
第16章构建工具、测试及程序发布
本书最后一章讨论与程序发布有关的且经常被人忽视但却非常重要的主题。详细介绍如何使用构建工具轻松地压缩、缩减和合并JavaScript文件,从而保证文件大小和HTTP延时的最小化。另外,介绍Dojo提供的单元测试框架以及优化应用程序性能的相关技巧。
本书还包含两个附录:一个Firebug教程和一个对DojoX的评述。虽然由特殊的实验性扩展组成的DojoX绝对称得上是一个部件与模块的百宝箱,因为其中既包含图表和加密算法,又包含让人赞叹不已且高度灵活的网格部件,但是,与Base、Core和Dijit相比,无论从稳定性还是API一致性方面,DojoX的子项目都要稍差一些;要全面介绍DojoX,恐怕再多出本书现有的篇幅也不够。
另一个附录是一个简明的Firebug教程,该教程可以让读者在短时间内迅速了解Firebug的重要特性,并掌握如何通过其命令行式的界面来调试JavaScript脚本和试验新的思路。如果有读者还没听说过Firebug,那么在这里我可以告诉你,Firebug是Firefox的一个优秀扩展,可以通过它来彻底解构一个页面的各种组成要素——从查看和操作DOM节点的样式,到监控网络通信状况,乃至使用命令行界面执行JavaScript代码。
本书不包括的内容
虽然本书力求为读者提供与Dojo本身的深度和广度相适应的内容,但仍然有一些主题会被排除在外:
Web开发101
本书虽然全面深入地介绍Dojo,但并没有为读者提供一个完整的Web开发教程,即读者在本书中看不到对HTML、JavaScript和CSS基础知识的讲解。
多余的API文档
本书对Dojo的绝大多数(注6)API给出了明确解释,而且为了便于查看,通常会以表格形式把这些API呈现给读者。由于Dojo的覆盖面的确太广了,因此,如果读者能充分理解这些API,那么一定会对选择使用恰当的特性有所帮助。不过,Dojo本身仍是一个发展中的项目,为保险起见,读者最好能同时参照其在线文档(http://api.dojotoolkit.org),以便获得最全面、权威的解释。与编程语言或者趋于刚性的应用框架不同,Dojo是一个由活跃的社区支持的发展中的项目,因此某些API有可能在新发布的版本中得到改进,从而更好地满足开发人员的需要。但是,根据官方的承诺,其1.x版本的API在2.0版之前不会有大的变动。因此,本书介绍的所有API在相当长一段时间内都将是有效的。而且,即使某些API有了变动,其在线文档也会捉前给出完备的说明。
非浏览器宿主环境
本书也不会详细阐述或针对Dojo在浏览器之外的应用(例如,在Rhino或Adobe AIR中)给出示例。另外,也不会涉及Dojo如何与其他客户端框架(例如,DWR、YUI!或Domino)协同工作的内容。
开源软件容易变化
Dojo是一个由活跃的社区支持的发展中的项目,因此,随时可能增加新特性。本书完全针对当前最新的Dojo1.1版本编写。但是,将来的版本可能会增加更多功能。读者应该密切关注Dojo最新版本的发布情况,并确保认真阅读1.1版之后的发布说明。
同样,鉴于Dojo的API在2.0版之前不会有大的变化,因此本书所有示例及相关信息在过渡期的小版本发布过程中会始终保持正确。而且,非正式的不推荐策略表明,一个主版本中被列为不推荐使用的特性,至少应该保持到下一个主版本发布之后才会被削减。换句话说,1.x版本中的某些特性如果被列为不推荐使用的特性,那么至少到2.0版发布之后(甚至更长时间之后)仍然会保持有效。因此,即使读者在拿到本书时Dojo 2.0已经发布了,但其中的代码示例也仍然应该能够正常运行。
本书读者对象
本书面向至少有一定Web开发经验的读者,即读者应该熟悉HTML、JavaScript和CSS等客户端技术。不过,并不要求读者是上述某种技术的专家,而且也无须了解大量Web服务器的知识,因为Dojo是一种客户端技术。只要读者对客户端的技术有一些了解,知道它们的用途和如何使用它们就足够了。
如果你本身就是一名Web开发人员,或者是能够创建简单的网页并运用JavaScript和CSS来增强它的Web开发爱好者,那么绝对应该阅读这本书。假如你从未听说过HTML、JavaScript或者CSS,也从没写过一行代码,那么恐怕在阅读本书之前必须先找一本Web开发入门之类的书好好研读一番。
开发工具
提到开发工具,虽然使用任何文本编辑器和浏览器都可以基于Dojo有效地完成开发任务,但本书推荐读者使用Firefox及其优秀的Firebug扩展。因为在Firebug中,可以对网页进行调试和分析,也可以通过它的控制台执行JavaScript代码。如果读者使用其他浏览器(如IE),尽管也可以使用Firebug Lite,但完整版Firebug的功能要比它强大得多,相信它是不会让读者失望的。(一般来说,使用Firefox和Firebug做开发,然后经常性地在IE中测试是个不错的方法。)Firefox的下载地址为http://getfirefox.com,Firebug的下载地址为http://getfirebug.com。
另外两个基于Firefox的工具也可以考虑,它们分别是Chris Pederick开发的Web Developer Toolbar和Firefox的Clear Cache Button扩展。Web Developer Toolbar提供了Web开发中常用的另外一些功能,下载地址是http://chrispederick.com/work/web-developer/;而Clear Cache Button扩展实际上就是一个用于快速清除本地缓存的按钮,安装后可以把它拖动到工具栏中,下载地址是https://addons.mozilla.org/en-US/firefox/addon/1801。有时候,如果你的浏览器“不正常”了,显示的都是一些过时的内容,那么清理一下缓存很可能会解决问题。...
……