第一部分 构建过程 2
第1章 构建优先 2
1.1问题出现了 2
1.1.1 45分钟内每秒损失17万美元 3
1.1.2构建优先 3
1.1.3繁琐的前戏 4
1.2遵守构建优先原则,提前计划 5
1.3构建过程 7
1.4处理应用的复杂度和设计理念 8
1.5钻研构建优先原则 12
1.5.1检查代码质量 12
1.5.2在命令行中使用lint工具 15
1.6总结 18
第2章 编写构建任务,制定流程 19
2.1介绍Grunt 20
2.1.1安装Grunt 21
2.1.2设置第一个Grunt任务 23
2.1.3使用Grunt管理构建过程 24
2.2预处理和静态资源优化 26
2.2.1详述预处理 26
2.2.2处理LESS 28
2.2.3打包静态资源 31
2.2.4简化静态资源 32
2.2.5创建子图集 34
2.3检查代码完整性 36
2.3.1清理工作目录 36
2.3.2使用lint程序检查代码 37
2.3.3自动运行单元测试 38
2.4首次自己编写构建任务 38
2.5案例分析:数据库任务 39
2.6总结 41
第3章 精通环境配置和开发流程 42
3.1应用的环境 42
3.1.1配置构建模式 43
3.1.2环境层面的配置 47
3.1.3开发环境有什么特别之处 48
3.2配置环境 48
3.2.1瀑布式存储配置的方法 49
3.2.2通过加密增强环境配置的安全性 50
3.2.3使用系统级方式设置环境层面的配置 52
3.2.4在代码中使用瀑布式方法合并配置 53
3.3自动执行繁琐的首次设置任务 54
3.4在持续开发环境中工作 54
3.4.1监视变动,争分夺秒 55
3.4.2监视Node应用的变动 56
3.4.3选择一款合适的文本编辑器 57
3.4.4手动刷新浏览器已经过时了 58
3.5总结 58
第4章 发布、部署和监控 59
4.1发布应用 60
4.1.1优化图像 60
4.1.2缓存静态资源 62
4.1.3内嵌对首屏至关重要的CSS 64
4.1.4部署前要测试 65
4.2预部署操作 65
4.2.1语义化版本 66
4.2.2使用更改日志 67
4.2.3提升版本号时提交更改日志 67
4.3部署到Heroku 68
4.3.1在Heroku的服务器中构建 70
4.3.2管理多个环境 71
4.4持续集成 71
4.4.1使用Travis托管的CI 72
4.4.2持续部署 73
4.5监控和诊断 74
4.5.1日志和通知 74
4.5.2调试、Node应用 76
4.5.3分析性能 78
4.5.4运行时间和进程管理 78
4.6总结 79
第二部分 管理复杂度 82
第5章 理解模块化和依赖管理 82
5.1封装代码 83
5.1.1理解单一职责原则 84
5.1.2信息隐藏和接口 86
5.1.3作用域和this关键字 87
5.1.4严格模式 90
5.1.5提升变量的作用域 91
5.2 JavaScript模块 92
5.2.1闭包和模块模式 92
5.2.2原型的模块化 93
5.2.3 CommonJS模块 94
5.3管理依赖 95
5.3.1依赖图 95
5.3.2介绍RequireJS 98
5.3.3 Browserify:在浏览器中使用CJS模块 100
5.3.4 Angular管理依赖的方式 100
5.4理解包管理 102
5.4.1 Bower简介 103
5.4.2大型库,小组件 104
5.4.3选择合适的模块系统 105
5.4.4学习循环依赖 105
5.5 ECMAScript 6新功能简介 106
5.5.1在Grunt任务中使用Traceur 107
5.5.2 Harmony中的模块 107
5.5.3创建块级作用域的let关键字 108
5.6总结 109
第6章 理解JavaScript中的异步流程控制方法 110
6.1使用回调 110
6.1.1跳出回调之坑 111
6.1.2解开混乱的回调 112
6.1.3嵌套请求 114
6.1.4处理异步流程中的错误 116
6.2使用async库 119
6.2.1使用瀑布式、串行还是并行 119
6.2.2异步函数式任务 123
6.2.3异步任务队列 124
6.2.4制定流程和动态流程 125
6.3使用Promise对象 127
6.3.1 Promise对象基础知识 127
6.3.2链接Promise对象 130
6.3.3控制流程 132
6.3.4处理被拒绝的Promise对象 133
6.4理解事件 134
6.4.1事件和DOM 134
6.4.2自己实现事件发射器 135
6.5展望:ES6生成器 138
6.5.1创建第一个生成器 138
6.5.2生成器的异步性 140
6.6总结 141
第7章 使用模型-视图-控制器模式 142
7.1 jQuery力不胜任 142
7.2在JavaScript中使用MVC模式 145
7.2.1为什么使用Backbone 146
7.2.2安装Backbone 147
7.2.3使用Grunt和Browserify编译Backbone模块 147
7.3介绍Backbone 148
7.3.1 Backbone视图 149
7.3.2创建Backbone模型 152
7.3.3使用Backbone集合组织模型 154
7.3.4添加Backbone路由器 155
7.4案例分析:购物清单 157
7.4.1从静态购物清单开始 157
7.4.2添加删除按钮 159
7.4.3把物品添加到购物车中 161
7.4.4实现行内编辑 164
7.4.5服务层和视图路由 170
7.5 Backbone和Rendr:服务器和客户端共享渲染 172
7.5.1 Rendr简介 172
7.5.2理解Rendr的样板代码 174
7.5.3一个简单的Rendr应用 176
7.6总结 182
第8章 测试JavaScript组件 184
8.1 JavaScript测试速成课 185
8.1.1隔离逻辑单元 185
8.1.2使用TAP 186
8.1.3编写第一个单元测试 186
8.1.4在浏览器中运行使用Tape编写的测试 187
8.1.5筹备、行动和断言 188
8.1.6单元测试 188
8.1.7便利性优于约定 189
8.1.8案例分析:为事件发射器编写单元测试 189
8.1.9测试事件发射器 190
8.1.10测试.on方法 192
8.1.11驭件、侦件和代理 193
8.1.12模拟 194
8.1.13介绍Sinon.js 195
8.1.14监视函数的调用情况 195
8.1.15 代理require调用 196
8.2在浏览器中测试 198
8.2.1伪造XHR请求和服务器响应 198
8.2.2案例分析:测试DOM交互 200
8.3案例分析:为使用MVC模式开发的购物清单编写单元测试 209
8.3.1测试视图路由器 209
8.3.2测试视图模型的验证 214
8.4自动运行Tape测试 216
8.4.1自动运行浏览器中的Tape测试 217
8.4.2持续测试 218
8.5集成测试、外观测试和性能测试 218
8.5.1集成测试 219
8.5.2外观测试 219
8.5.3性能测试 220
8.6总结 221
第9章 RESTAPI设计和分层服务架构 222
9.1规避API设计误区 222
9.2学习REST API设计 223
9.2.1端点、HTTP方法和版本 224
9.2.2请求、响应和状态码 227
9.2.3分页、缓存和限流 229
9.2.4为API编写文档 231
9.3实现分层服务架构 232
9.3.1路由层 233
9.3.2服务层 233
9.3.3数据层 234
9.3.4路由层 234
9.3.5服务层 234
9.3.6数据层 235
9.4在客户端使用REST API 235
9.4.1请求处理层 236
9.4.2中止旧请求 236
9.4.3使用一致的方式处理AJAX错误 237
9.5总结 238
附录A Node.js的模块 240
附录B 介绍Grunt 242
附录C 选择合适的构建工具 249
附录D JavaScript代码质量指南 257