Service Worker 实现全站离线阅读的核心是按需预加载关键内容、智能管理缓存生命周期并提供可感知的离线体验:精准缓存HTML页面、关键CSS/字体/结构化数据;主动预取下一章资源;通过状态提示、下载按钮和定制离线页增强体验;版本更新时切换缓存名并清理旧缓存,对HTML采用stale-while-revalidate策略。

用 Service Worker 实现全站离线阅读,核心不是“缓存全部资源”,而是按需预加载关键内容、智能管理缓存生命周期,并提供用户可感知的离线体验。它更像一本可更新的电子书,而非静态快照。
精准缓存:只存真正需要的“书页”
盲目缓存整个网站(尤其是含大量图片、第三方脚本的页面)既低效又浪费用户存储空间。应聚焦于用户高频访问的结构化内容:
- HTML 页面(如文章详情页、目录页),用
Cache API按 URL 模式匹配,例如/post/\d+/或/book/chapter-\d+/ - 内联或关键 CSS / 字体 / 离线图标,确保排版与基础样式可用
- 结构化数据(如 JSON 格式的章节元信息),用于构建本地目录和跳转逻辑
- 避免缓存动态接口(如评论、登录态相关请求)、第三方广告或分析脚本
主动预取:把“下一章”悄悄装进缓存
用户点击“下一页”前,Service Worker 可监听导航行为,在后台静默预取后续章节 HTML 和关联资源:
- 在
fetch事件中识别翻页请求(如 URL 含?page=2或路径为/chapter/3) - 调用
cache.addAll()预加载该章节所需资源(HTML + 对应 CSS + 封面图) - 配合
navigationPreloadAPI,让浏览器在 SW 启动期间并行发起原始请求,提升首屏速度
离线优先体验:让用户明确知道“书已备好”
不能只靠技术兜底,需设计清晰的用户反馈:
- 页面加载时检测
navigator.onLine,结合caches.match()验证关键资源是否就位,显示“已缓存|离线可用”状态条 - 提供手动“下载整本书”按钮,触发批量缓存指定章节范围(如全部
/book/chapter-*) - 离线访问失败时,返回定制化离线页(
/offline.html),带本地目录导航和重试按钮,不显示浏览器默认错误页
版本可控:旧“书页”自动换新
网站更新后,缓存必须同步演进,否则用户看到的是过期内容:
- 在 SW 安装阶段,用新缓存名(如
book-v2.1)创建缓存,同时保留旧缓存名供过渡使用 - 激活阶段调用
cache.delete()清理旧缓存,避免磁盘占用累积 - 对 HTML 资源启用
stale-while-revalidate策略:先返回缓存内容,再后台拉取更新,保证阅读不中断


















