移动端离线神器:rxdb-supabase 双向同步实战,断网照样流畅
移动端离线神器rxdb-supabase 双向同步实战断网照样流畅【免费下载链接】supabaseThe Postgres development platform. Supabase gives you a dedicated Postgres database to build your web, mobile, and AI applications.项目地址: https://gitcode.com/GitHub_Trending/supa/supabase移动应用最让人头疼的场景之一莫过于地铁隧道、电梯、偏远地区那几秒到几分钟的断网用户正在填表、发消息、记笔记界面转圈、数据丢失、体验崩坏。传统方案要么强制在线BaaS 的短板要么自己写一套本地缓存加手动同步维护成本极高。社区里一个名为 rxdb-supabase 的开源方案给出了更优雅的答案用 RxDB 把整张 Supabase 表复制到客户端本地断网时读写全部落在本地 IndexedDB网络恢复后由复制引擎自动双向同步、自动解决冲突。本文结合 rxdb-supabase 的源码与 Supabase 官方仓库的真实文档拆解它的同步原理、落地代码与适用边界。RxDB 与 Supabase 双向同步的原理先说两个主角的分工。RxDB 是一个 offline-first 的客户端数据库所有读写都落在本地存储如 IndexedDB应用层永远秒开Supabase 则是开源的 Firebase 替代品底层是带行级安全RLS的 PostgreSQL。rxdb-supabase 的核心思想是借用 RxDB 的复制协议replication protocol在本地 RxDB 数据库与远程 Supabase 表之间建立一条双向同步通道。这个库在 Supabase 侧做了什么准备仓库 README 中明确写了两个约束表上必须有_modified时间戳字段记录最近修改时间用于增量拉取以及_deleted布尔字段用软删除代替物理删除避免删除在部分客户端尚未复制时直接消失。这两个字段正是增量同步与删除传播的基石。在本地它把 Supabase 表中当前用户经 RLS 过滤后可见的行的完整副本存入 RxDB因此应用可以完全离线工作。整个复制流程模仿 git 的思维分为三个阶段执行Pull拉取先按_modified增量拉取远端在本地上次同步后发生变化的所有行Push推送把本地写入以 INSERT/UPDATE 形式推给 Supabase默认采用乐观并发校验——只有当远端行所有字段仍等于本地写入时的旧值时更新才成功否则触发冲突处理器Watch监听初始同步完成后借助 Supabase Realtime 订阅该表的实时变更把其他客户端产生的变化即时回灌本地。其中第三步依赖的 Realtime在 Supabase 仓库的官方文档中有非常清晰的架构说明Realtime 是一个基于 Elixir/Phoenix 的全局分布式集群客户端通过 WebSocket 连接任意节点当客户端初始化postgres_changes扩展时集群会连接到 Postgres 数据库从逻辑复制槽logical replication slot持续拉取 Write-Ahead LogWAL流再把变更以 JSON 包的形式通过 WebSocket 广播给订阅者见 Realtime 架构文档。这意味着 rxdb-supabase 的实时回灌并非轮询而是数据库层面的原生变更流。离线写入、网络恢复自动合并的代码实现下面把完整链路跑一遍。首先是服务端创建一个带同步字段的表并用moddatetime触发器保证_modified自动更新对应 rxdb-supabase 文档中的建表 SQLCREATE TABLE public.humans ( id text NOT NULL, name text NOT NULL, age smallint, _deleted boolean DEFAULT false NOT NULL, _modified timestamp with time zone DEFAULT now() NOT NULL ); ALTER TABLE ONLY public.humans ADD CONSTRAINT humans_pkey PRIMARY KEY (id); CREATE TRIGGER update_modified_datetime BEFORE UPDATE ON public.humans FOR EACH ROW EXECUTE FUNCTION extensions.moddatetime(_modified);客户端侧先用 RxDB 创建一个与表结构匹配的集合并在集合上挂载可选的冲突处理器import { createRxDatabase } from rxdb import { getRxStorageDexie } from rxdb/plugins/storage-dexie const myDatabase await createRxDatabase({ name: humans, storage: getRxStorageDexie(), // 底层使用 IndexedDB }) const mySchema { title: human schema, version: 0, primaryKey: id, type: object, properties: { id: { type: string, maxLength: 100 }, name: { type: string }, age: { type: integer }, }, required: [id, name, age], indexes: [age], } const myCollections await myDatabase.addCollections({ humans: { schema: mySchema }, })之后所有业务读写都直接操作本地集合完全不需要关心网络状态const doc await myCollections.humans.insert({ id: 1, name: Alice }) await doc.patch({ age: 21 }) await doc.remove()最关键的一步是启动双向复制。SupabaseReplication负责把本地集合与远端表绑在一起pull: {}与push: {}同时存在即启用双向同步const replication new SupabaseReplication({ supabaseClient: supabaseClient, // 已初始化且完成登录RLS 场景 collection: myCollection, replicationIdentifier: myId SUPABASE_URL, pull: {}, push: {}, })断网场景下这个方案的体验是这样的离线期间所有写操作被 RxDB 收集在本地变更队列中界面零卡顿网络恢复时复制引擎按照 retryTime默认 5000ms自动重试若检测到navigator.onLine由离线切回在线会立即跳过等待时间发起同步。此外由于实时监听在客户端间歇性离线时会漏掉远端变更官方建议在应用恢复联网时主动调用replication.reSync()补一次全量增量拉取参考 rxdb-supabase 文档中的 online 事件监听与 reSync 说明。错误处理则通过replication.errors$流观察随时可replication.cancel()停止复制。冲突处理与适用场景边界双向同步最怕两边同时改同一行。rxdb-supabase 的默认策略很务实推送更新前逐字段校验旧值一旦发现远端行已被他人修改就把本地写入判为冲突调起集合的conflictHandler。默认行为是放弃本地写入、以远端状态为准保证数据一致性优先你也可以实现自己的策略例如只要某字段没被对方改动就仍合并该字段。需要特别注意的是默认的 updateHandler 目前不支持 JSON 字段——因为 Supabase 客户端缺少对 JSON 字段做等值校验的简单手段所以含 JSON 列的表必须自定义updateHandler。频繁删除的场景则建议启用 RxDB 的 cleanup 插件把已同步删除的行从本地清理避免本地库无限膨胀。边界问题同样重要。offline-first 最大的代价是整表下载到客户端表越大、用户能访问的行越多首次同步与增量同步的负担越重。这正是仓库 Future work 中规划的方向分区复制类似 FireStore 的 subcollection、纯推送模式、以及把 RxDB 当作离线缓存而非离线优先数据库。此外软删除设计意味着 Supabase 侧的物理删除需要谨慎——必须确保所有客户端都已复制删除标记否则会出现幽灵数据。还要把安全因素纳入考量离线副本的本质是数据驻留在用户设备上因此务必配合 Supabase 的 RLS 策略让拉取请求只返回当前用户有权看到的行——RLS 在 Postgres 内部执行即便数据经由第三方客户端读取也受到保护见 Row Level Security 文档。这在本地副本即服务端数据子集的架构下是最后一道安全闸门。适用场景移动端表单填写、消息类应用、巡检/外勤记录、网络不稳定的企业级应用——凡是写入必须即时成功、断网不可避免、数据量可控的场景rxdb-supabase 都能交出流畅体验不适用的场景服务端海量大表全量复制成本过高、需要强一致实时协作应以 Realtime 原生订阅为主、以及包含复杂 JSON 结构且不想写自定义更新逻辑的表。在移动优先、网络劣化常态化的今天把数据库搬进客户端、把同步交给协议正在成为构建离线体验的标准姿势。rxdb-supabase 证明了Supabase 的 Postgres 底座加上 RxDB 的复制协议完全可以拼出一台断网照样流畅的移动端同步引擎。【免费下载链接】supabaseThe Postgres development platform. Supabase gives you a dedicated Postgres database to build your web, mobile, and AI applications.项目地址: https://gitcode.com/GitHub_Trending/supa/supabase创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

awesome-dsh-plugin 插件截图声明完全指南:screenshots.json 约定详解与常见错误避坑

awesome-dsh-plugin 插件截图声明完全指南:screenshots.json 约定详解与常见错误避坑

awesome-dsh-plugin 插件截图声明完全指南:screenshots.json 约定详解与常见错误避坑 【免费下载链接】awesome-dsh-plugin A curated list of plugins for DeepSeek Harness (dsh) DeepSeek Harness 插件精选列表 项目地址: https://gitcode.com/gh_mirrors/aw/…

2026/10/12 23:44:46 阅读更多 →
2026年7月大模型“无限战争”下,TaoToken 统一 Key 如何应对性能座次再无安全区

2026年7月大模型“无限战争”下,TaoToken 统一 Key 如何应对性能座次再无安全区

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 6:33:06 阅读更多 →
WOE编码完全指南:从数学原理到Python实现的风控特征工程

WOE编码完全指南:从数学原理到Python实现的风控特征工程

在信贷风控、用户增长、营销响应这类二分类问题里,特征工程做来做去,最后大家都会遇到同一个东西:WOE编码。很多刚接触特征工程的读者会把它当成某种“高级黑魔法”,其实说白了,WOE编码就是把一个原始特征的值或区间&a…

2026/10/13 8:38:53 阅读更多 →

最新新闻

前驱图与AOE网:用同一张DAG看懂操作系统与数据结构中的时间形状

前驱图与AOE网:用同一张DAG看懂操作系统与数据结构中的时间形状

期中周的那个深夜,我左手压着操作系统的教材,右手摊开数据结构的复习讲义。一边是前驱图的判断题,一边是AOE网的关键路径大题,我本来只想把这两页一起看掉,省得来回翻书,结果越看越不对劲——怎么它们画出来…

2026/10/13 10:02:18 阅读更多 →
EM算法详解:从隐变量推断到高斯混合模型实战

EM算法详解:从隐变量推断到高斯混合模型实战

1. 这不是数学课,是机器学习里“猜谜游戏”的通关手册 你有没有遇到过这样的场景:训练一个高斯混合模型时,明明数据摆在那里,却不知道每个样本该属于哪个高斯成分;做隐变量建模时,手握观测数据X&#xff0c…

2026/10/13 10:02:18 阅读更多 →
UserCF推荐算法原理与Python工程实践指南

UserCF推荐算法原理与Python工程实践指南

1. 项目概述:为什么UserCF至今仍是推荐系统入门必修课“基于用户的协同过滤算法(UserCF)”这九个字,听起来像教科书里的一个章节标题,但在我带过的二十多个实际推荐项目中,它几乎出现在每一个从零搭建的冷启…

2026/10/13 10:02:18 阅读更多 →
RAG知识库问答系统‘查得到答不对’的根因与工程化解法

RAG知识库问答系统‘查得到答不对’的根因与工程化解法

简介:这是一套开箱即用的大语言模型RAG知识库问答系统实现方案,面向AI工程师、企业知识中台建设者及高校科研人员,解决私域文档智能问答中幻觉高、召回差、模型绑定强等核心痛点。资源包共937个文件,以484个Python后端逻辑与向量化…

2026/10/13 10:02:18 阅读更多 →
C#实现STEP文件解析器:从词法分析到B-Rep实体树构建

C#实现STEP文件解析器:从词法分析到B-Rep实体树构建

简介:面向计算机专业本科毕设的STEP文件解析器项目,基于C#实现STEP中性文件的元素识别、拓扑关系提取与自定义数据结构保存,并通过STL格式转换配合Three.js完成3D模型加载显示。压缩包共19个文件,大小仅35KB,包含9个C#…

2026/10/13 10:02:18 阅读更多 →
用层次分析法(AHP)科学决策就业选择

用层次分析法(AHP)科学决策就业选择

1. 为什么就业选择不能只靠“感觉”和“听说”刚带完一届毕业设计,有位A同学连续三周来找我聊就业方向:一会儿说“听说算法岗钱多”,一会儿又焦虑“听说现在卷得不行”,最后拿出一张密密麻麻的Excel表,列了8家公司的岗…

2026/10/13 10:01:17 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 21:05:09 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →