第1章 Sinatra 1
1.1 简单的领域特定语言 2
1.2 第1天:构建一个书签应用 2
1.2.1 你好,Sinatra 3
1.2.2 用RSpec来测试 4
1.2.3 REST风格的API 6
1.2.4 数据持久化 6
1.2.5 创建和读取书签 8
1.2.6 编写自动化测试 9
1.2.7 更新和删除书签 10
1.2.8 我们在第1天学到的 11
1.3 第2天:创建视图 12
1.3.1 ERB简介 12
1.3.2 Mustache介绍 17
1.3.3 Slim介绍 20
1.3.4 我们在第2天学到的 23
1.4 第3天:添加新功能 24
1.4.1 校验 24
1.4.2 块参数 26
1.4.3 过滤器 27
1.4.4 为书签打上标签 28
1.4.5 添加标签的API支持 31
1.4.6 使用正则表达式来匹配路由 33
1.4.7 我们在第3天学到的 34
1.5 总结 35
1.5.1 Sinatra的强项 35
1.5.2 Sinatra的弱项 35
1.5.3 最后的思考 36
第2章 CanJS 37
2.1 CanJS的独一无二之处 37
2.2 第1天:创建对象和同步变化 39
2.2.1 你好,CanJS 40
2.2.2 构建和扩展对象 41
2.2.3 观察属性的变化 44
2.2.4 使用CanJS创建一个前端书签应用 46
2.2.5 连接模型与服务器 47
2.2.6 渲染视图 48
2.2.7 动态绑定 50
2.2.8 我们在第1天学到的 50
2.3 第2天:创建控制器 51
2.3.1 将控制器绑定到页面元素上 52
2.3.2 监听UI事件 53
2.3.3 使用data()方法从页面获取数据模型 54
2.3.4 使用观察者实现控制器之间的沟通 55
2.3.5 创建一个表单控制器 57
2.3.6 我们在第2天学到的 60
2.4 第3天:与模型的协作 61
2.4.1 添加校验 62
2.4.2 实现标签的处理 64
2.4.3 过滤书签 66
2.4.4 创建一个标签列表 69
2.4.5 使用路由管理浏览器的位置 71
2.4.6 我们在第3天学到的 73
2.4.7 对CanJS的创造者JustinB.Meyer的采访 74
2.5 总结 76
2.5.1 CanJS的强项 76
2.5.2 CanJS的弱项 76
2.5.3 最后的思考 76
第3章 AngularJS 77
3.1 概览 77
3.2 第1天:使用依赖注入 79
3.2.1 你好,AngularJS 80
3.2.2 创建服务 83
3.2.3 换个角度来看我们的书签应用前端 86
3.2.4 使用资源服务 87
3.2.5 为服务写自动化测试 89
3.2.6 我们在第1天学到的 93
3.3 第2天:创建控制器和视图 93
3.3.1 创建控制器和使用视图指令 95
3.3.2 利用数据双向绑定的优势 97
3.3.3 创建书签表单 98
3.3.4 关于作用域的重要注意事项 100
3.3.5 端到端的自动化测试 102
3.3.6 我们在第2天学到的 104
3.4 第3天:创建过滤器和路由 105
3.4.1 为书签添加标签 106
3.4.2 构建一个标签列表 107
3.4.3 通过过滤器操作数据 108
3.4.4 定义路由 112
3.4.5 我们在第3天学到的 114
3.4.6 对AngularJS创建者MiskoHevery的采访 115
3.5 总结 116
3.5.1 AngularJS的强项 116
3.5.2 AngularJS的弱项 117
3.5.3 最后的思考 117
第4章 Ring 118
4.1 Ring简介 118
4.2 第1天:基础组件 120
4.2.1 起步 121
4.2.2 Hello,World! 121
4.2.3 用Korma处理数据 124
4.2.4 用Hiccup把数据转化为HTML 130
4.2.5 使用Compojure处理路由 133
4.2.6 我们在第1天学到的 136
4.3 第2天:拼接的模式 137
4.3.1 定义API 137
4.3.2 处理JSON 138
4.3.3 验证输入 140
4.3.4 可组合的路由 143
4.3.5 我们在第2天学到的 146
4.4 第3天:构建应用的其他方法 147
4.4.1 Ring中间件 147
4.4.2 Enlive 149
4.4.3 关于测试 153
4.4.4 我们在第3天学到的 154
4.4.5 对James Reeves的采访 155
4.5 总结 156
4.5.1 Ring的强项 156
4.5.2 Ring的弱项 157
4.5.3 最后的思考 158
第5章 Webmachine 159
5.1 Webmachine简介 159
5.2 第1天:HTTP请求状态机 161
5.2.1 起步 162
5.2.2 Hello,World 162
5.2.3 和资源函数一起工作 165
5.2.4 资源函数 166
5.2.5 请求转发 169
5.2.6 参数化转发 170
5.2.7 我们在第1天学到的 171
5.3 第2天:构建应用 172
5.3.1 短链接 172
5.3.2 使用Mustache模板引擎 179
5.3.3 Petite里的模板 182
5.3.4 处理多种内容类型 184
5.3.5 我们在第2天学到的 186
5.4 第3天:照亮HTTP的阴暗面 186
5.4.1 让资源可缓存 187
5.4.2 身份验证 193
5.4.3 我们在第3天学到的 196
5.4.4 对Justin Sheehy的采访 197
5.5 总结 198
5.5.1 Webmachine的强项 198
5.5.2 Webmachine的弱项 199
5.5.3 最后的思考 199
第6章 Yesod 200
6.1 Yesod简介 201
6.1.1 组成部分 201
6.1.2 计划 201
6.2 第1天:你不能搞错的数据 202
6.2.1 新手入门 202
6.2.2 Hello, World 203
6.2.3 使用DSL描述数据 205
6.2.4 使用模型 207
6.2.5 改变和删除模型 210
6.2.6 我们在第1天学到的 211
6.3 第2天:视图、表单和认证 212
6.3.1 Ye Olde的模板语言 213
6.3.2 功能性表单 216
6.3.3 认证和授权 219
6.3.4 我们在第2天学到的 223
6.4 第3天:继续Rumble 224
6.4.1 创建头版 225
6.4.2 创建一个发布新闻表单 228
6.4.3 查看新闻与提交评论 230
6.4.4 我们在第3天学到的 233
6.4.5 对Michael Snoyman的采访 234
6.5 总结 237
6.5.1 Yesod的强项 237
6.5.2 Yesod的弱项 238
6.5.3 最后的思考 238
第7章 Immutant 239
7.1 Immutant简介 239
7.1.1 Immutant的特性 240
7.1.2 计划 240
7.2 第1天:不仅仅是网络基础 241
7.2.1 开始 241
7.2.2 Hello, World 242
7.2.3 分布式缓存 244
7.2.4 计划任务 249
7.2.5 我们在第1天学到的 250
7.3 第2天:构建数据管道 251
7.3.1 消息队列 251
7.3.2 管道 255
7.3.3 Overwatch的管道 257
7.3.4 我们在第2天学到的 262
7.4 第3天:多语言应用 263
7.4.1 叠加 263
7.4.2 集群 268
7.4.3 我们在第3天学到的 272
7.4.4 对Jim Crossley的采访 273
7.5 总结 275
7.5.1 Immutant的强项 275
7.5.2 Immutant的弱项 275
7.5.3 最后的思考 276
第8章 结束 277
8.1 关键想法 277
8.1.1 简单性 278
8.1.2 代码运行在何处 278
8.1.3 组合 279
8.1.4 声明式优先于指令式 279
8.1.5 动态类型和静态类型 280
8.1.6 状态机 280
8.1.7 交互性 281
8.2 快乐的探索吧 281