离线优先应用(无 Firebase):使用 GenosDB 的 P2P 方法

发布: (2026年2月16日 GMT+8 06:49)
7 分钟阅读
原文: Dev.to

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 Pozziestebanrfp)创建。

💡 **[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/)**
0 浏览
Back to Blog

相关文章

阅读更多 »