离线待办应用需四步实现:1. service worker缓存静态资源并拦截请求;2. indexeddb异步存储任务数据并支持索引查询;3. 网络恢复时同步未synced任务;4. indexeddb失败时降级使用localstorage。

构建一个离线待办事项应用,核心在于用 Service Worker 缓存静态资源、用 IndexedDB 存储任务数据,并通过 Cache API 和 localStorage fallback 提升容错性。不需要后端,纯前端就能实现可靠离线体验。
用 Service Worker 实现页面离线可访问
Service Worker 是离线能力的基石,它能拦截网络请求并返回缓存内容。
- 在主 JS 中注册 worker:
navigator.serviceWorker.register('sw.js'),注意 sw.js 必须与页面同源且位于根目录或更高层级 - 在
sw.js中监听install事件,用cache.addAll()预缓存 HTML、CSS、JS 和图标等静态资源 - 监听
fetch事件:优先从 cache match,未命中再走网络;对 API 请求(如 /api/tasks)可跳过缓存,留给 IndexedDB 处理 - 添加
skipWaiting()和clients.claim()确保新版本立即生效,避免旧缓存干扰
用 IndexedDB 管理待办数据(替代 localStorage)
localStorage 容量小、阻塞主线程、不支持索引查询,而 IndexedDB 支持事务、异步、结构化存储,更适合待办这种需增删改查的场景。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 用
open()创建数据库(如todoDB),设定 version;首次打开时在onupgradeneeded中建 objectStore(如tasks),设keyPath: 'id'并添加completed索引便于筛选 - 封装增删改查方法:例如
addTask({ text, completed, createdAt })调用add();getTasks({ filter = 'all' })使用index.get()或openCursor()查询 - 所有操作都基于事务(
transaction(['tasks'], 'readwrite')),失败时 catch 错误并提示用户“保存失败,请重试”
同步机制:网络恢复后自动上传变更
用户离线编辑的任务,需要在网络恢复时同步到服务端(如果后续扩展后端)或仅做本地持久化。当前纯离线场景下,重点是保证本地状态一致。
- 监听
window.online和window.offline事件,更新 UI 状态(如显示“已离线”提示) - 为每条任务记录
synced: true/false字段,离线新增/修改时设为 false;上线后遍历未同步项,逐条处理(可批量) - 若未来对接后端,可用 Background Sync API(需 HTTPS + 注册 sync event),但当前阶段用
fetch().then().catch()手动重试更可控
兜底策略:IndexedDB 失败时降级用 localStorage
虽然 IndexedDB 是首选,但在某些老旧浏览器或隐私模式下可能不可用。加入简单 fallback 可提升健壮性。
- 初始化时尝试打开 IndexedDB,失败则启用 localStorage 版本(仅支持字符串,需
JSON.stringify()存取) - localStorage 方案只保留基础功能:任务列表数组、简单增删改,不支持过滤索引或大量数据
- 在控制台打印 warning:“IndexedDB 不可用,已降级为 localStorage”,方便调试和后续优化
不复杂但容易忽略细节:缓存策略要区分静态资源和动态数据、IndexedDB 的错误边界必须处理、离线状态反馈要及时可见。把这四块搭稳,一个真正可用的离线待办就跑起来了。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










