前言 xi
第 1 章 渐进式Web 应用介绍 1
1.1 Web 反击战 2
1.2 当前的移动领域 2
1.3 渐进式Web 应用的优势 4
1.4 浏览器标签页、Web 和service worker 6
第 2 章 你的第 一个service worker 8
2.1 设置示例项目 8
2.2 欢迎来到哥谭帝国酒店 9
2.3 熟悉代码 10
2.4 当前的离线体验 11
2.5 创建你的第 一个service worker 13
2.6 什么是渐进增强 16
2.7 HTTPS 和service worker 16
2.8 从Web 获取内容 17
2.9 捕获离线请求 18
2.10 创建HTML 响应 19
2.11 理解service worker 作用域 21
2.12 小结 22
第3 章 CacheStorage API 23
3.1 CacheStorage 是什么,不是什么 24
3.2 决定何时进行缓存 24
3.3 在CacheStorage 中存储请求 25
3.4 从CacheStorage 中取回请求 26
3.5 在示例应用缓存 27
3.6 匹配每个请求的正确响应 29
3.7 HTTP 缓存和HTTP 头 31
3.8 小结 31
第4 章 service worker 生命周期和缓存管理 33
4.1 service worker 生命周期 36
4.2 service worker 的生命周期与waitUntil 的重要性 38
4.3 更新service worker 39
4.4 为什么需要管理缓存 40
4.5 缓存管理与清除旧缓存 42
4.6 重用已缓存的响应 46
4.7 配置服务器以提供正确的响应头部 47
4.8 开发者工具 48
4.8.1 控制台 48
4.8.2 清除缓存并刷新 48
4.8.3 检查CacheStorage 和IndexedDB 49
4.8.4 网络节流与模拟离线情况 49
4.8.5 Lighthouse 50
4.9 小结 50
第5 章 拥抱离线优先 51
5.1 什么是离线优先 52
5.2 常用缓存模式 53
5.3 混合与匹配:创造新模式 55
5.4 规划缓存策略 57
5.5 实现缓存策略 59
5.6 App shell 架构 68
5.7 实现App shell 70
5.8 解锁成就 72
5.9 小结 73
第6 章 使用IndexedDB 在本地存储数据 74
6.1 什么是IndexedDB 75
6.2 使用IndexedDB 77
6.2.1 打开数据库连接 77
6.2.2 数据库版本/ 修改对象存储 78
6.2.3 添加数据到对象存储 79
6.2.4 从对象存储中读取数据 80
6.2.5 IndexedDB 版本管理 81
6.2.6 使用游标读取对象 82
6.2.7 创建索引 84
6.2.8 使用索引读取数据 85
6.2.9 限制游标的范围 86
6.2.10 设置游标方向 87
6.2.11 更新对象存储中的对象 87
6.2.12 从对象存储删除对象 88
6.2.13 从对象存储中删除所有对象 89
6.2.14 处理冒泡IndexedDB 错误 89
6.3 SQL 忍者的IndexedDB 90
6.4 IndexedDB 实践 91
6.5 promise 式的数据库 98
6.6 IndexedDB 管理 103
6.7 在service worker 中使用IndexedDB 104
6.8 IndexedDB 生态系统 105
6.8.1 PouchDB 105
6.8.2 localForage 106
6.8.3 Dexie.js 106
6.8.4 IndexedDB Promised 107
6.9 小结 107
第7 章 使用后台同步保证离线功能 108
7.1 后台同步是如何工作的 109
7.2 SyncManager 111
7.2.1 访问SyncManager 111
7.2.2 注册事件 112
7.2.3 sync 事件 112
7.2.4 事件标签 112
7.2.5 获取已注册sync 事件列表 113
7.2.6 最后的机会 113
7.3 传递数据给sync 事件 114
7.3.1 在IndexedDB 中维护操作队列 114
7.3.2 在IndexedDB 中维护请求队列 116
7.3.3 传递数据给sync 事件标签 118
7.4 给应用添加后台同步 118
7.5 小结 125
第8 章 使用postMessage() 在service worker 和页面之间通信 126
8.1 窗口向service worker 通信 127
8.2 service worker 向所有打开的窗口通信 128
8.3 service worker 向特定窗口通信 130
8.4 使用MessageChannel 保持通信渠道打开 131
8.5 窗口间的通信 133
8.6 从sync 事件向页面传递消息 136
8.7 小结 137
第9 章 可安装的Web 应用:占领主屏先机 138
9.1 可安装的Web 应用 139
9.2 浏览器如何决定何时显示应用安装横条 140
9.3 剖析Web 应用清单 141
9.4 各端兼容性 145
9.5 小结 146
第 10 章 推送通知 147
10.1 推送通知的生命周期 147
10.1.1 Notification API 147
10.1.2 Push API 148
10.1.3 Push+Notification 150
10.2 创建通知 150
10.2.1 请求通知权限 150
10.2.2 显示通知 153
10.2.3 为哥谭帝国酒店添加通知支持 157
10.3 为用户订阅推送事件 158
10.3.1 生成VAPID 公钥和私钥 160
10.3.2 生成GCM 密钥 161
10.3.3 创建新订阅 162
10.3.4 为哥谭帝国酒店用户订阅推送消息 164
10.4 从服务端发送推送事件 166
10.5 监听推送事件并显示通知 168
10.6 小结 174
第 11 章 渐进式Web 应用的用户体验 175
11.1 优雅与信任 175
11.2 从service worker 传递状态 176
11.3 使用Progressive UI KITT 通信 178
11.4 渐进式Web 应用中的常见消息 180
11.4.1 缓存完成 180
11.4.2 页面已缓存 180
11.4.3 操作失败,但会在用户恢复连接时完成 181
11.4.4 启用通知 181
11.5 选择正确的用词 181
11.6 不要直奔主题 182
11.7 渐进式Web 应用的设计 184
11.7.1 设计应该反映条件的变化 184
11.7.2 设计应该适应运行环境 185
11.7.3 设计应该适应每种媒介的特殊性 185
11.7.4 设计应该向用户注入信心并通知用户 186
11.7.5 设计应该帮助用户和企业实现目标 186
11.8 负责安装提示 186
11.9 使用RAIL 测量性能并实现高性能 187
11.10 小结 189
第 12 章 渐进式Web 应用的未来 190
12.1 使用Payment Request API 接受支付请求 190
12.2 使用Credential Management API 进行用户管理 192
12.3 WebGL 实时图像处理 193
12.4 未来的语音识别API 194
12.5 使用WebVR 在浏览器中实现虚拟现实 194
12.6 轻松共享应用 195
12.7 流畅的媒体播放UI 196
12.8 下一个伟大时代 197
附录A service worker:采用ES2015 的大好时机 198
附录B 全页间隙式广告 201
附录C CORS 与NO-CORS 202
关于作者 204
关于封面 204