离线优先应用(无 Firebase):使用 GenosDB 的 P2P 方法
Source: Dev.to
Firebase 是当有人问 “如何实现实时同步数据?” 时的默认答案。
说实话,它在自己的领域确实做得不错。但有一个陷阱,大多数开发者往往发现得太晚:
你在向 Google 租用数据层。
- 成本增长不可预测。
- 不能在本地运行或自行托管。
- 如果 Google 停止该产品(他们以前就这么做过),你的架构也会随之崩溃。
- 用户数据存放在 Google 的服务器上,受 Google 条款约束。
- 虽然有离线支持,但它只是缓存层——并非真正的离线优先架构。
什么是“离线‑优先”真正含义
大多数“离线兼容”应用把离线模式视为降级状态:缓存一些数据,显示加载动画,并祈祷重新连接。
真正的离线‑优先是不同的。 应用在默认情况下即可完全离线工作。 当有网络连接时进行同步——这是一种额外的好处,而非必须。
这意味着:
- 数据库驻留在客户端。
- 写入操作始终在本地即时完成。
- 当对等方连接时,数据会自动同步。
- 服务器不再是瓶颈,也不再是单点故障。
GenosDB:纯 JavaScript 的 P2P 图数据库
GenosDB 是专为此设计的点对点图数据库。它在浏览器中运行,使用 OPFS(Origin Private File System)在本地存储数据,并通过 WebRTC 在节点之间同步——信令通过 Nostr relays 完成,因此即使是连接设置也不需要中央服务器。
快速设置
npm install genosdb
import { gdb } from "genosdb";
const db = await gdb("my-app"); // 仅本地数据库
这就是一个功能完整的本地数据库。无需 API 密钥。无需项目设置。无需计费页面。
添加 P2P 同步
const db = await gdb("my-app", { rtc: true });
只需一个标志。现在运行你的应用的每个节点都会自动同步数据。无需 WebSocket 服务器。无需 Firebase 项目。无需配置。
构建协作式 Todo 应用 — 零服务器
让我们来做点真实的事:一个多用户协作、完全离线优先、支持 P2P 同步的 Todo 应用。
import { gdb } from "genosdb";
const db = await gdb("todos", { rtc: true });
// Add a todo
async function addTodo(text) {
return await db.put({
text,
done: false,
created: Date.now(),
});
}
// Toggle completion
async function toggleTodo(id) {
const todo = await db.get(id);
await db.put({ ...todo, done: !todo.done }, id);
}
// Reactive UI — fires on local AND remote changes
db.map((todo, id) => {
renderTodo(id, todo);
});
刚才发生了什么
- 数据本地存储在 OPFS 中 — 完全离线也能工作。
- 当另一个节点连接时,Todo 通过 WebRTC 同步。
map回调会在本地写入和收到的 P2P 更新时触发。- 没有任何服务器参与处理。没有发起 API 调用,也没有产生费用。
Firebase 与 GenosDB — 何时使用哪一个
说实话,Firebase 并不差;它只是一个不同的取舍。
选择 Firebase 的情形
- 需要服务器端逻辑(Cloud Functions)。
- 想要开箱即用的社交登录托管认证。
- 团队倾向于不做任何基础设施决策。
- 可以接受供应商锁定和基于使用量的计费。
选择 GenosDB 的情形
- 需要真正的离线优先(而非仅仅缓存)。
- 需要在不运行服务器的情况下进行点对点同步。
- 希望数据层没有经常性费用。
- 隐私至关重要——数据保留在用户设备上。
- 正在构建协作、多人或分布式应用。
- 更倾向于拥有自己的技术栈,避免供应商依赖。
技术栈
在底层,GenosDB 使用:
- OPFS 作为持久化存储(比
localStorage或 IndexedDB 更快、更可靠)。 - MessagePack + Pako 进行紧凑的二进制序列化。
- Hybrid Logical Clocks 实现跨节点的无冲突因果顺序。
- Delta sync + full‑state fallback 提供高效且具弹性的 P2P 同步。
- Nostr relays 用于 WebRTC 信令——无需自建服务器。
- Cellular Mesh 拓扑结构,以支持大规模节点网络的扩展。
它也是模块化的。需要自然语言查询吗?{ nlq: true }。地理空间功能?{ geo: true }。AI 集成?{ ai: true }。只加载你使用的部分即可。
入门
npm install genosdb
import { gdb } from "genosdb";
// Local only
const local = await gdb("app");
// With P2P sync
const synced = await gdb("app", { rtc: true });
// With security
const secure = await gdb("app", {
rtc: true,
sm: { superAdmins: ["your-address"] },
});
完整文档和示例:
Source: …
网络不需要许可
构建在开放协议之上的最大好处是,没有人能把它夺走。没有服务条款的更改。没有价格的更新。没有停运公告。
你的应用、你的数据、你的规则。这才是离线优先的真正意义。
我叫 estebanrfp —— 全栈开发者,dWEB 研发。 我构建 GenosDB 是因为我相信网络的数据层应该是免费、分布式并且归使用它的人所有。
本文是 GenosDB(GDB)官方文档的一部分。
GenosDB 是一个分布式、模块化、点对点图数据库,采用零信任安全模型,由 Esteban Fuster Pozzi(estebanrfp)创建。
💡 **[Examples](https://github.com/estebanrfp/gdb/blob/main/docs/genosdb-examples.md)**
Code snippets and usage demos
📖 **[Documentation](https://github.com/estebanrfp/gdb/blob/main/docs/index.md)**
Full reference guide
🔍 **[API Reference](https://github.com/estebanrfp/gdb/blob/main/docs/genosdb-api-reference.md)**
Detailed API methods
📚 **[Wiki](https://github.com/estebanrfp/gdb/wiki)**
Additional notes and guides
💬 **[GitHub Discussions](https://github.com/estebanrfp/gdb/discussions)**
Community questions and feedback
🗂 **[Repository](https://github.com/estebanrfp/gdb)**
Minified production‑ready files
📦 **[Install via npm](https://www.npmjs.com/package/genosdb)**
Quick setup instructions
🌐 **[Website](https://estebanrfp.com/)** | **[GitHub](https://github.com/estebanrfp)** | **[LinkedIn](https://www.linkedin.com/in/estebanrfp/)**