JavaScript应用程序设计:使用Node、HTML5和现代JavaScript类库打造稳健的Web应用

更多详情

内容简介: 如何利用JavaScript语言的强大特性来构建易于扩展与维护的企业级JavaScript应用,这是很多人都在考虑的问题。对于有经验的JavaScript开发者来说,在实际项目中遵循本书中介绍的设计模式,会让编码变得更加灵活且富有伸缩性。
JavaScript恐怕是现今世界上最为流行的Web开发语言,但在实际应用中,程序源码的不断修改往往会使得JavaScript应用变得易碎且不稳定。在本书中,Eric Elliott向我们展示了在大型JavaScript应用中,如何安全而有效地为客户端与服务端添加特性。

目录: 前言 1
第1章 JavaScript的革命时代 7
JavaScript的特性 8
性能 8
对象 8
语法 9
函数是一等公民 9
事件 9
复用性 10
结论 10
解构现代JavaScript应用 10
基础架构 10
JSON ——数据存储与通信 11
NoSQL数据库 12
RESTful JSON Web Services 12
第2章 函数 15
减少隐式副作用 16
函数声明 18
lambdas 22
立即执行函数表达式 23
方法上下文 25
函数作用域 27
变量提升 28
闭包 30
方法API的设计 33
参数命名 33
多态函数 34
范型编程与集合多态 37
链式调用与流式API 40
函数式编程 41
无状态函数(纯函数) 43
偏函数应用与函数加里化 44
异步操作 45
回调函数 46
Promises与Deferreds 46
小结 49
第3章 对象 50
过时的类继承 51
流式JavaScript 53
原型 56
原型代理 56
原型克隆 58
享元模式 60
创建对象 61
工厂函数 63
使用Stamps进行原型继承 66
小结 71
第4章 模块 73
模块化编程原则 74
接口 75
模块模式 79
AMD规范 81
加载器插件 82
CommonJS模块规范 84
npm包管理器 85
ES6模块规范 87
基于CommonJS、npm、Grunt与Browserify构建客户端应用 89
定义应用 89
特性实现 91
构建与部署 94
小结 98
第5章 关注点分离 99
客户端的关注点 100
模块管理 101
模型-视图-控制器 113
表现层与Dom操作 116
服务端关注点 123
Node与Express入门 124
在Node中组织代码 125
小结 132
第6章 访问控制 134
身份验证 134
密码认证 134
Credential类库 138
多因素身份验证 140
联合认证与授权认证 142
应用功能授权 144
应用授权 144
OAuth 2.0协议 145
小结 146
第7章 日志 147
调试 147
服务端数据监控 149
安全/入侵检测 149
审计 150
业务指标分析 150
传播力度 151
日志清单 151
应用请求日志 152
异常日志 156
日志输出示例 158
日志预警 161
跟踪业务指标(效果跟踪) 162
性能分析与优化 162
客户端事件记录 163
日志数据挖掘 164
小结 165
第8章 构建RESTful API 166
可用性 167
专一性 167
一致性 169
自描述的超媒体 177
功能可见性 177
超媒体即应用状态引擎 178
HTML:一种特别的API媒介类型 180
Jade 180
Jiron 182
响应式API 184
性能优化 186
小结 187
第9章 特性开关 188
组织特性 188
特性的规模 188
特性编组 189
特性的生命周期 189
开发阶段 190
预发布阶段 190
灰度测试 190
正式发布 190
默认激活 191
完整集成 191
客户端实现 191
小结 195
第10章 应用工程国际化 196
小结 198
附录A JavaScript编码风格指南 199

译者序: 说来也巧,结识JavaScript这门语言还是在我上初中那会儿,那时候微软与网景两大浏览器巨头还在为市场份额互相掐架,许多人仍旧搞不清JScript与JavaScript之间的关系,市面上少有的几本与JavaScript有关的教程除了基本语法介绍外,就是挨个将DOM属性罗列一遍,看得让人着急。就当时Web平台的现状而言,很难想象这门语言今后会与“应用”两个字紧密联系在一起。时光一晃就是10年, 2011年,当我以前端开发工程师的身份加入阿里时,我才领会到这门语言背后的真正魔力。
JavaScript正在成为编程界的一门通用语言,它已经从母体,即负责信息展现与内容分发的Web平台中慢慢走出来,开始涉足并接管更多的领域,从服务端系统搭建到创建效率工具,从移动OS平台到各类沉浸感十足的3D游戏,JavaScript正在不断地向外界证明它不仅仅只是一门“胶水语言”,到目前为止,它的语言规范仍在向前演进。
本书从JavaScript独有的语言特性开始,作者以灵活、简洁、优雅为中心思想,一路向我们介绍了构建一款完整JavaScript应用所需的方方面面。要确保JavaScript应用既稳健又具伸缩性,开发者除了掌握JavaScript本身的语言特性,还需要对软件工程中的API设计、关注点分离、异步编程、单元测试等重要的概念做深入的了解,除此以外在项目开发中采用良好且一致的编码风格也是降低应用后期维护成本的有效手段,所有这些在本书中均有囊括。无论你是PC/移动端的WebApp开发者,还是仅对JavaScript这门语言所独有的特性感到好奇的入门者,这本书都不会让你失望。
本书作者Eric Elliott是一位JavaScript专家,他的过往工作经历与头衔中无处不闪烁着JavaScript字样,同时他还是一位音乐人、一位摄影师和一名电影爱好者。也许出于这个原因,在本书中你能明显感觉到Eric Elliott所注入的艺术气息,无论是解决问题的思路还是代码的编排,Eric Elliott都在试图向读者呈现更为优雅的解决方案。当然,由于专业知识与精力有限,译者在翻译过程中难免出现疏漏与失误,恳请广大读者批评指正。
感谢机械工业出版社华章公司的陈佳媛编辑对我的信任与帮助,感谢我的师兄刘洋洋(额台)对很多关键的技术性问题提出的宝贵意见,感谢阿里智能云前端团队的同事於振华(方元哥)、李春城(琦轩)、曹仁(曹纯)在翻译过程中给予我诸多建议和指导,还要感谢我的两位好朋友蒙克、赤目给予我的鼓励。感谢家里“领导”对我翻译工作的理解与支持,最后特别感谢我的母亲,过年在家为了赶稿没少让您操心。
吴斌 (柳翎)
2015年4月于杭州

前言: 在本书中我们先后提到了不少Web开发类书籍,但对于那些想从头开始学习构建完整JavaScript应用的读者来说,市面上真正值得推荐的JavaScript教程又显得十分稀缺。与此同时,现在几乎每一个互联网创业公司的人员配备中都少不了资深JavaScript应用程序开发者的角色。本书旨在帮助人们了解如何构建易于扩展和维护的完整JavaScript应用。
本书并不打算向读者详细讲解JavaScript语言基础,它基于你现有的JavaScript知识结构,向你展示那些会让你的编码工作长久受益的JavaScript特性与技巧。一般来说,随着应用程序的规模不断扩大,添加新功能与缺陷修复开始变得越来越难以下手,代码随之变得脆弱、臃肿,甚至一个非常小的改动都可能带来大范围的代码重构。如果你在编码过程中遵循了本书中介绍的设计模式,你会发现代码开始变得灵活而富有伸缩性,对代码的细微变更不会再对其他模块产生负面影响。
本书的内容主要聚焦在客户端JavaScript应用设计上,同时也会穿插一些较为基础的Node、RESTful API等服务端技术介绍。应用逻辑前端化已经是大势所趋,以往我们常常将模板渲染、与第三方服务通信等任务交给服务端去处理,诸如此类的工作如今通常在浏览器中完成。
事实上,现今的JavaScript应用已经在浏览器中扮演起了传统桌面级应用的角色。当然,这一切仍然离不开服务端的技术支撑,像静态资源托管、动态模块加载、数据持久化、操作日志记录以及第三方API服务调用等,这些都属于服务端的职能范畴。
本书内容涵盖:
面向应用开发者的JavaScript特性与最佳实践。
代码组织、模块化与复用。
· 客户端关注点分离(MVC等)。
· 服务端与API的通信机制。
· 用Node.js设计并实现RESTful API。
· 构建、测试、团队协作、应用部署与扩展。
· 应用工程的国际化。
本书目标读者
具备一定的JavaScript开发基础,有至少1或2年的JavaScript实践经验,并想了解如何使用JavaScript开发大规模Web或企业级应用的开发者。
抱有强烈的学习热情,尤其是对闭包、函数式编程、原型继承这些JavaScript语言独有的强大特性想做了解与尝试的编程入门者。(即使你是第一次听到这些概念。)
也许你想在下一个具有挑战性的JavaScript项目中使用TDD(测试驱动开发)技术,本书所有的代码范例中均包含测试用例。在你读完本书后,代码自测的意识与方法也会随之建立起来。
不太适合本书的读者
本书不面向JavaScript初学者,涉及JavaScript基础技术点的地方会一带而过。如果你想对这些技术点进行深入了解,可以在Douglas Crockford的《JavaScript精粹》(O扲eilly,2008)以及David Flannagan的《JavaScript 权威指南》编注1(O扲eilly,2011)中找到相关解读。由著名的“四人帮”(Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides) 合著的《设计模式:可复用面向对象软件的基础》编注2(http://bit.ly/1pwzcUc)(Addison-Wesley,1994)会帮助你更好地理解设计模式。
Google与维基百科同样是信息查阅的好帮手,对软件设计模式来说,维基百科是一份非常不错的参考资料。
如果这是你第一次接触JavaScript,我建议你在步入正篇之前先把基础功课做足。Marijn Haverbeke所著的《Eloquent JavaScript》(http://eloquentjavascript.net/)(No Starch Press,2011 )是我个人比较喜爱的一本JavaScript入门教程,还有上文中提到的《JavaScript 精粹》,最好每一个章节都通读一遍。另外,特别留意下附录A,这是JavaScript开发前辈们对自己所犯的错误做的系统总结,从中你可以获得一些启发。
单元测试
很难估量单元测试在应用中的重要性,本书中几乎所有的代码样例中均附有单元测试用例。编写测试用例让你对功能实现了解得更为透彻,对方案与接口设计的把握越来越谨慎,设计测试用例的过程同样是迫使你思考将代码解耦的过程。保持编写单元测试与解耦代码的习惯会使你在今后的工作中持续受益,相信在读完本书之后你会收获这种编码习惯。
关于单元测试与编码风格的更多内容,请参见本书附录A。
本书的约定
本书使用下列排版约定:
斜体 (italic)
用于表示新术语、URL、电子邮件地址、文件名、文件扩展名。
等宽字体 (constant width)
用来表示程序列表和代码片段,包括变量或函数名、数据库、数据类型、环境变量、语句和关键字等。
等宽加粗字体 (constant width bold)
用来表示命令或者其他用户直接输入的文本。
等宽斜体 (constant width italic)
用来表示可被替换的字符或文本,这些字符在合适的场景和特定的条件下会被替换成其他的值。
注意: 表示一种提示、建议或一般的消息提醒。
警告: 表示一种警告。
Safari Books Online
Safari在线图书是一个数字图书馆,读者可以在这个图书馆里自选图书, 在这里可以搜索到超过7500本与技术和创作相关的书籍和视频,在这里可以迅速找到你想要的内容。
订阅之后,你就可以阅读在线图书馆的任意图书的任意章节和任意视频。你还可以将图书 下载到手机和移动设备里。在纸质书籍出版前就可以抢先阅读,甚至可以抢先阅读作者手稿,并实时给作者反馈。同时还可以复制和粘贴实例代码、组织你的收藏内容、下载章节、将关键段落加入书签、创建笔记、打印出来,你既可以节省时间,又可以提升阅读效率。
O'Reilly Media已经将本书上传至Safari在线图书馆里了。如果想在线阅读本书和其他相关内 容,请免费登录http://my.safaribooksonline.com。
联系我们
对于本书的评论或问题请联系出版商:
美国:
O'Reilly Media,Inc.
1005 Gravenstein Highway North
Sebastopol,CA 95472
中国:
北京市西城区西直门南大街2号成铭大厦C座807室(100035)
奥莱利技术咨询(北京)有限公司
我们为本书制作了一个Web页面,页面中包含了简介、样章以及其他信息。可以从这里访问这个页面:
http://bit.ly/programming-jsa
如果要留言或者提交关于本书的技术问题的反馈,请发邮件至:
bookquestions@oreilly.com
本书的更多信息、资源、参考文献和新闻,请登录出版社官网:
http://www.oreilly.com.cn
http://www.oreilly.com
Facebook:http://facebook.com/oreilly
Twitter:http://twitter.com/oreillymedia
YouTube:http://www.youtube.com/oreillymedia
致谢
感谢@JS_Cheerleader(https://twitter.com/JS_Cheerleader)给予我的鼓励,你提供的JavaScript在线资源非常棒!
感谢Brendan Eich一直以来不知疲倦地推动JavaScirpt与Web技术向前发展。感谢整个O'Reilly团队,感谢Simon St. Laurent,是你让这本书有机会与读者见面,我知道你一直都在给我加油鼓劲!感谢Brian McDonald对本书的宝贵意见,感谢Meghan Blanchette,你总是不断地给我打气!感谢以下每一个人对本书的技术审校与建议:
· César Andreu
· James Halliday (Substack)
· Hugh Jackson
· Ramsey Lawson
· Shelley Power
· Kyle Simpson
· Kevin Western
特别感谢本书中所有开源软件项目的作者,向开源社区中那些不断提升JavaScript应用程序用户体验的开发者致敬,身为软件开发者,我们正站在巨人的肩膀上。

媒体评论: “Eric Elliott不仅就JavaScript的重要语言特性做了简明扼要的介绍,而且还对JavaScript应用中的诸多关键技术与工具进行了深入的探讨,我只能说:没有读过本书的人千万不要随便乱碰JavaScript应用!”
——Kyle Simpson Web开放标准布道者