O’Reilly Media, Inc.介绍
O’Reilly Media 通过图书、杂志、在线服务、调查研究和会议等方式传播创新知识。自
1978 年开始,O’Reilly 一直都是前沿发展的见证者和推动者。超级极客们正在开创着未来,
而我们关注真正重要的技术趋势——通过放大那些“细微的信号”来刺激社会对新科技
的应用。作为技术社区中活跃的参与者,O’Reilly 的发展充满了对创新的倡导、创造和
发扬光大。
O’Reilly 为软件开发人员带来革命性的“动物书”;创建第一个商业网站(GNN);组
织了影响深远的开放源代码峰会,以至于开源软件运动以此命名 ;创立了 Make 杂志,
从而成为 DIY 革命的主要先锋 ;公司一如既往地通过多种形式缔结信息与人的纽带。
O’Reilly 的会议和峰会集聚了众多超级极客和高瞻远瞩的商业领袖,共同描绘出开创新
产业的革命性思想。作为技术人士获取信息的选择,O’Reilly 现在还将先锋专家的知识
传递给普通的计算机用户。无论是通过书籍出版,在线服务或者面授课程,每一项 O’Reilly
的产品都反映了公司不可动摇的理念——信息是激发创新的力量。
业界评论
“O’Reilly Radar 博客有口皆碑。”
——Wired
“O’Reilly 凭借一系列(真希望当初我也想到了)非凡想法建立了数百万美元的业
务。”
——Business 2.0
“O’Reilly Conference 是聚集关键思想领袖的绝对典范。”
——CRN
“一本 O’Reilly 的书就代表一个有用、有前途、需要学习的主题。”
——Irish Times
“Tim 是位特立独行的商人,他不光放眼于最长远、最广阔的视野并且切实地按照
Yogi Berra 的建议去做了 :‘如果你在路上遇到岔路口,走小路(岔路)。’回顾过去
Tim 似乎每一次都选择了小路,而且有几次都是一闪即逝的机会,尽管大路也不错。”
——Linux Journal
译者序
从第一眼看到封面上这只憨憨的猫头鹰开始,就深深地喜欢上了这本 JavaScript Web
Applications,读了简介和目录之后就已经不能自拔了。这几年鲜有深入讲架构级 web
app 的好书,这让这本 JavaScript Web Applications 更加难得,作为 O'Rielly 第一本专注
于讲纯高端 JavaScript 架构思想的书,凡是有一点“架构情节“的工程师都不应当错过
此书。
如今 Web 应用程序的开发已经越来越向传统应用软件开发靠拢了,Web 和应用之间的
界限也进一步模糊。传统编程语言中的设计模式、MVC、应用架构等理论也在慢慢地融
入 Web 前端开发。随着服务器端 JavaScript 和移动终端的兴起,作为一名前端工程师,
也深知自己正处在一个深刻变革的年代,面对眼花缭乱的新概念和新技术更应当把握本
质、认清方向,勇于创新和实践,而这本 JavaScript Web Applications 的出现更是一阵及
时雨,为我们工作中遇到的很多难题提供了解决方案和最佳实践。同时,这本书所涵盖
的知识点非常全面,从 MVC 的基本理论到网络协议、从模块解耦到异步编程模型、从
HTML5/CSS3 到 NodeJS、从软件测试到部署调试,对于很多前端工程师来说,这些知
识正是突破自己的瓶颈所亟需的。
这本书将专注于讲述如何构建“优雅又不失高水准”(state of the art)的 JavaScript 应用,
包括软件架构、模板引擎、框架和库、同服务器的消息通信等内容。书中同样提供了大
量的示例代码,可以帮助你更深入地理解很多重要的概念。除此之外,作者在 MVC 和
架构方面的很多观点都很有启发性,即使你不是一名 JavaScript 程序员,读完本书后也
会受益匪浅。
本书作者 Alex MacCaw 是一名 Ruby/JavaScript 程序员,是 Spine 框架的开发者。在翻
译本书的过程中,我深深体会到他作为一名优秀工程师所具备的扎实的计算机专业功底
和让人敬佩的开源精神。尽管这本书包含大量的专业术语,但作者文笔轻松流畅,即使
直接读原文也丝毫不会感到枯燥,所以我们在翻译过程中也是非常小心,生怕丢掉这种
轻松流畅的阅读感觉,尽力为大家原汁原味地呈现本书。当然由于专业知识所限,翻译
过程难免疏漏,还希望各位高手批评指正。
最后,我要感谢博文视点的张春雨在译书过程中给予我们的帮助和信任。感谢我的好友
王保平(玉伯)对很多关键的技术性问题提出的宝贵意见,还要感谢可爱的同事杨振楠(栋
寒)、杨翰文(地极)、李燕青(霸先)、车思慧(灵玉)、陈良(舒克)的细心校对,他
们给译文提了很多中肯的建议。当然,最最需要感谢的是家中的“领导”,已经记不得
多少次赶译稿加班太晚,得到的不是你的抱怨,而是你的鼓励,心里已经觉得很满足。
李晶(拔赤),张散集(一舟)
2011 年 12 月 北京
vi | 译者序
目录
前言 ............................................................................. xv
第1章 MVC和类 ............................................................1
之初 .........................................................................................................................1
增加结构 ..................................................................................................................2
什么是 MVC ............................................................................................................2
模型 ..................................................................................................................3
视图 ..................................................................................................................4
控制器 ..............................................................................................................5
向模块化进军,创建类 ............................................................................................6
给类添加函数...........................................................................................................7
给“类”库添加方法 ...............................................................................................8
基于原型的类继承 .................................................................................................10
给“类”库添加继承 ............................................................................................. 11
函数调用 ................................................................................................................12
控制“类”库的作用域 ..........................................................................................15
添加私有函数.........................................................................................................17
“类”库 ..................................................................................................................18
第2章 事件和监听 ........................................................21
监听事件 ................................................................................................................21
事件顺序 ................................................................................................................22
取消事件 ................................................................................................................23
事件对象 ................................................................................................................23
事件库 ....................................................................................................................25
切换上下文 ............................................................................................................26
委托事件 ................................................................................................................26
自定义事件 ............................................................................................................27
自定义事件和 jQuery 插件 .....................................................................................28
DOM 无关事件 ......................................................................................................30
第3章 模型和数据 ........................................................33
MVC 和命名空间 ...................................................................................................33
构建对象关系映射(ORM) ...................................................................................34
原型继承 ........................................................................................................35
添加 ORM 属性 ..............................................................................................36
持久化记录.....................................................................................................37
增加 ID 支持 ..........................................................................................................39
寻址引用 ................................................................................................................40
装载数据 ................................................................................................................41
直接嵌套数据 .................................................................................................42
通过 Ajax 载入数据 ........................................................................................42
JSONP ............................................................................................................46
跨域请求的安全性 .........................................................................................46
向 ORM 中添加记录 ..............................................................................................47
本地存储数据.........................................................................................................47
给 ORM 添加本地存储 ..........................................................................................49
将新记录提交给服务器 ..........................................................................................51
第4章 控制器和状态 .....................................................53
模块模式 ................................................................................................................54
全局导入 ........................................................................................................54
全局导出 ........................................................................................................54
添加少量上下文 .....................................................................................................55
抽象出库 ........................................................................................................56
viii | 目录
文档加载完成后载入控制器 ..........................................................................58
访问视图 ........................................................................................................59
委托事件 ........................................................................................................61
状态机 ....................................................................................................................63
路由选择 ................................................................................................................65
使用 URL 中的 hash .......................................................................................65
检测 hash 的变化 ............................................................................................66
抓取 Ajax .......................................................................................................67
使用 HTML5 History API ...............................................................................68
第5章 视图和模板 ........................................................71
动态渲染视图.........................................................................................................71
模板 .......................................................................................................................73
模板 Helpers ...................................................................................................75
模板存储 ........................................................................................................75
绑定 .......................................................................................................................77
模型中的事件绑定 .........................................................................................78
第6章 依赖管理 ...........................................................81
CommonJS .............................................................................................................82
模块的声明.....................................................................................................83
模块和浏览器 .................................................................................................83
模块加载器 ............................................................................................................84
Yabble ............................................................................................................84
RequrieJS .......................................................................................................85
包装模块 ................................................................................................................87
模块的按需加载 .....................................................................................................88
LABjs .............................................................................................................89
无交互行为内容的闪烁(FUBC) ..........................................................................89
第7章 使用文件 ...........................................................91
浏览器支持 ............................................................................................................91
获取文件信息.........................................................................................................92
文件输入 ................................................................................................................92
目录 | ix
拖拽 .......................................................................................................................93
拖拽 ................................................................................................................94
释放拖拽 ........................................................................................................96
撤销默认的 Drag/Drop ...................................................................................97
复制和粘贴 ............................................................................................................97
复制 ................................................................................................................98
粘贴 ................................................................................................................99
读文件 .................................................................................................................. 100
二进制大文件和文件切割 ............................................................................ 101
自定义浏览器按钮 ............................................................................................... 102
上传文件 .............................................................................................................. 102
Ajax 进度条 .................................................................................................. 104
jQuery 拖拽上传 .................................................................................................. 106
创建拖拽目标区域 ....................................................................................... 106
上传文件 ...................................................................................................... 107
第8章 实时Web .........................................................109
实时 Web 的发展历史 .......................................................................................... 109
WebSocket ............................................................................................................ 110
Node.js 和 Socket.IO .................................................................................... 114
实时架构 .............................................................................................................. 116
感知速度 .............................................................................................................. 117
第9章 测试和调试 ......................................................119
单元测试 .............................................................................................................. 121
断言 .............................................................................................................. 121
QUnit ............................................................................................................ 122
Jasmine ......................................................................................................... 126
驱动 ..................................................................................................................... 128
无界面的测试....................................................................................................... 131
Zombie ......................................................................................................... 132
Ichabod ......................................................................................................... 134
分布式测试 .......................................................................................................... 135
x | 目录