pwa离线流畅交互需以离线为常态:预缓存app shell资源、用indexeddb存业务数据、fetch分层响应、联网后自动同步。

要让 PWA 在无网环境下依然流畅交互,关键不是“等网络恢复再做事”,而是从设计之初就把离线当作常态——UI能快速响应、数据可本地存取、操作不因断网中断。
预缓存核心资源,秒开骨架
用户打开页面的第一感受来自 App Shell(界面框架),比如导航栏、标题栏、加载占位符。这部分必须离线可用:
- 在 Service Worker 的 install 阶段,用
caches.open().addAll()预缓存 HTML 模板、CSS、核心 JS 和图标等静态资源 - 缓存名带版本号(如
'shell-v2'),便于后续更新时自动淘汰旧缓存 - 避免缓存动态内容(如文章正文、用户列表),它们由 IndexedDB 管理,而非 Cache API
用 IndexedDB 存业务数据,支持读写改删
光有界面不够,用户得能查记录、记笔记、填表单。这些操作依赖本地数据库:
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 在页面 JS 中调用
indexedDB.open()初始化库,不要在 Service Worker 里打开——它不支持同步阻塞操作 - 每个 objectStore 设计关键字段:
id(主键)、updatedAt(时间戳索引)、syncStatus('pending'/'synced')、op('create'/'update'/'delete') - 离线保存表单时,直接写入 DB 并标记
syncStatus: 'pending',不依赖网络确认
请求拦截与分层响应策略
Service Worker 拦截 fetch 请求后,需按资源类型区别处理:
- 对 HTML/CSS/JS:执行 Cache First,没命中再 fallback 到网络(但离线时就只走缓存)
- 对 API 接口:采用 Stale-While-Revalidate——先返回本地缓存数据渲染界面,再后台拉新数据更新
- 对图片等大资源:可设 Network First + Cache fallback,优先加载最新图,失败则展示已缓存版本
联网后自动同步,不打断用户流程
用户在地铁里写了三条笔记,出站后手机自动连上 Wi-Fi —— 这些操作应无声完成:
- 监听
navigator.onLine变化,或更可靠地使用 Background Sync API - 按
updatedAt倒序遍历syncStatus === 'pending'的记录,逐条提交到服务端 - 接口需幂等(如带唯一
X-Request-ID),防止重复提交;成功后更新本地syncStatus和serverId - 失败超过 3 次转为手动同步,并在 UI 显式提示“有 X 条未同步”
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










