用Service Worker缓存静态资源、IndexedDB存储笔记数据、网络恢复自动同步、离线状态感知UI,四步构建健壮离线记事本:1.注册SW缓存HTML/CSS/JS;2.IDB存笔记并标记syncStatus;3.联网后自动同步pending操作;4.页面实时反馈离线状态并保证操作一致性。

用 Service Worker + IndexedDB 实现一个真正可用的离线记事本,核心是让新增、编辑、删除操作在断网时仍能生效,并在网络恢复后自动同步。
1. 用 Service Worker 拦截网络请求并缓存静态资源
先注册一个 Service Worker,缓存 HTML、CSS、JS 和图标等静态文件,确保页面本身能离线加载。
- 在主 JS 中调用 navigator.serviceWorker.register('sw.js') 注册脚本
- 在 sw.js 中监听 install 事件,用 caches.open().addAll() 缓存关键资源(如 index.html、main.css、app.js)
- 监听 fetch 事件:优先返回缓存,缓存未命中再发起网络请求;对 HTML 请求启用 stale-while-revalidate 策略(缓存优先,后台更新)
- 注意:不要缓存 API 接口(如 /api/note),这类动态请求交给 IndexedDB 处理更合适
2. 用 IndexedDB 存储笔记数据,支持增删改查
IndexedDB 是浏览器内置的持久化数据库,适合存结构化笔记内容(标题、正文、时间戳、是否已同步等字段)。
- 创建数据库(如 noteDB),设版本号(如 1),定义 objectStore(如 notes),主键用 id(自增或 UUID)
- 每条笔记加一个 syncStatus 字段:'pending'(待同步)、'synced'(已同步)、'failed'(同步失败)
- 封装常用方法:addNote()、updateNote()、deleteNote()、getAllNotes(),所有操作都返回 Promise,方便 await
- 示例:新增笔记时,先写入 IndexedDB 并标记 syncStatus: 'pending',不依赖网络
3. 网络恢复时自动同步待处理操作
用户联网后,自动把本地未同步的笔记变更推送到服务器,避免手动“同步”按钮带来的体验断层。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
- 监听 navigator.onLine 变化,或更可靠地使用 serviceWorker.controller?.postMessage({ type: 'SYNC_IF_ONLINE' })
- 在 Service Worker 或主页面中,查询所有 syncStatus === 'pending' 的笔记,逐条调用 fetch 发送到后端 API
- 成功后更新该笔记的 syncStatus 为 'synced';失败则保留 pending 或改为 failed,并记录错误日志
- 可加简单重试机制(比如失败后延迟 5 秒再试一次),避免瞬时网络抖动导致失败
4. 页面逻辑与离线状态感知
让用户清楚当前是否离线,并保证操作反馈一致,不出现“保存失败”的突兀提示。
- 页面顶部显示状态条:在线 / 离线(数据已本地保存),用 navigator.onLine 初步判断,配合 fetch 失败兜底
- 所有保存操作统一走 IndexedDB,完成后立即更新 UI(比如刷新列表),不等待网络响应
- 删除笔记也先删 IndexedDB,再尝试发删除请求;若失败,可在 UI 中标记“待同步删除”,后续自动重试
- 首次加载时,从 IndexedDB 读取全部笔记渲染,再尝试拉取服务端最新数据做合并(如有冲突,按时间戳或最后修改优先)
不复杂但容易忽略:Service Worker 更新需手动 skipWaiting + clients.claim,IndexedDB 迁移要处理 versionchange,同步逻辑得防重复提交。把这四块串起来,就是一个健壮的离线优先记事本。

















