← 返回笔记

PWA 离线、Dexie 缓存与云端进度同步

2026.07.06 · 离线同步 · Quiz App

Quiz App 的一个核心目标是离线可用。这个目标让数据层设计变得很关键:题库不能只存在云端,练习进度也不能因为断网就丢失。项目用 Dexie 封装 IndexedDB,把题库、题目、会话、答案和用户进度都存到浏览器本地。

本地优先

本地数据表包括 banks、questions、sessions、answers 和 userProgress。组件通过 Dexie 的响应式查询读取数据,数据变化后 UI 自动更新。这样导入题库、删除题库、刷题记录和统计图表都能在本地闭环。

在线与离线双模式

有网络时,已登录用户的上传会进入 Supabase,并进入审核流程;没有网络时,应用仍然读取本地缓存。进度提交也分两条路径:在线时写云端并缓存本地,离线时先写入本地 pending 记录,恢复网络后再批量回写。

submitPracticeProgress(records, userId)
  online  -> Supabase + Dexie synced
  offline -> Dexie pending
syncPendingProgress(userId)
  pending -> batch insert -> mark synced

页面关闭兜底

文档里提到使用 navigator.sendBeacon 作为页面关闭时的兜底提交。这个细节很适合刷题场景:用户可能直接切走页面或关闭 PWA,如果只依赖普通请求,最后几题的进度容易丢。

Service Worker 更新

PWA 通过 Service Worker 缓存静态资源,并在新版本可用时显示更新提示。新版本不会悄悄替换当前页面,而是给用户一个明确的刷新入口。这样能减少“刚刷到一半页面突然变了”的问题。

离线能力的难点不是缓存文件,而是数据状态。只要 pending、synced、云端覆盖、本地缓存这些状态定义清楚,离线体验就不会变成一堆例外判断。