用途
本技能为 TanStack DB 提供离线事务支持,构建在 db-core 与 mutations-optimistic 之上。它让应用在断网或页面刷新后仍能保留乐观变更,并在恢复连接后自动提交到服务端。
主要能力
- 持久化发件箱:将事务序列化后写入存储,默认使用 IndexedDB,回退到 localStorage,页面刷新后可重放。
- 领导者选举:通过 WebLocks 或 BroadcastChannel 确保只有一个标签页处理发件箱,避免重复执行。
- 在线检测:基于 navigator.onLine 与事件,在连接状态变化时暂停或恢复执行。
- 事务执行:带重试与指数退避,支持抖动、并发上限、自定义重试决策。
- 幂等键:每个离线事务都带 idempotencyKey,可传给 API 防止重试产生重复记录。
- 存储降级:启动时探测存储可用性,不可用时进入 online-only 模式,变更仍可工作但不跨刷新持久化。
- React Native 支持:提供 react-native 入口,自动使用 ReactNativeOnlineDetector 与 AsyncStorage 兼容存储。
使用方式
通过 startOfflineExecutor 创建执行器,传入 collections 与 mutationFns,并等待 waitForInit() 完成初始化(存储探测、领导者选举、发件箱重放)。之后可用 createOfflineTransaction 或 createOfflineAction 创建离线事务;非领导者标签页会回退到普通 createTransaction/createOptimisticAction。
事务生命周期:变更先乐观应用到集合,再序列化持久化到发件箱;领导者标签页取出并执行 mutationFn;成功则移出发件箱并解决乐观状态,失败则按退避重试;页面刷新时重放发件箱并恢复乐观状态。
适用场景
适合需要在弱网、断网或页面刷新后仍保持用户操作不丢失的 Web 与 React Native 应用,尤其是使用 TanStack DB 乐观变更的待办、表单、离线优先类场景。
限制与注意事项
- 必须等待初始化完成后再创建事务,否则可能错过领导者选举结果并使用错误代码路径。
- collections 映射用于刷新后恢复乐观状态,缺失会导致待处理变更不显示乐观状态。
- 必须将 idempotencyKey 传给 API,否则重试可能产生重复记录。
- 永久性失败应抛出 NonRetriableError,避免无意义重试;默认策略在错误消息包含 400、401、403、422 时停止,其他错误可能无限重试。
- shouldRetry 钩子是同步的且被所有命名 mutationFn 共享;异步钩子会返回 Promise 并导致该发件箱行失败。
- 存储不可用(隐私浏览、配额超限)时进入 online-only 模式,变更不跨刷新持久化。
- 重启后不会恢复任意错误子类及其自定义字段,仅保留 name、message、stack。