跳到主要内容

别再让组件扛下全部数据复杂度

RxDB 的核心,是把存储、查询、模型与 UI 绑定拆成清晰层次,让复杂度各归其位。

layers01

四个层次,按执行职责划分

LAYER 01

存储层

SQLite 负责落盘、索引、事务与查询执行。

LAYER 02

响应式层

RxJS 把查询结果、实体变更和副作用汇成同一条数据流。

LAYER 03

模型层

实体元数据统一定义字段、关系、查询构造与生成代码的边界。

LAYER 04

协作层

分支、同步与撤销重做构建在本地数据版本之上,按需叠加。

execution plane02

浏览器就是主执行面

UI、业务规则、查询和本地持久化先在浏览器里闭环执行。远端只负责交换版本,不接管每一次读写。

Browser runtime

读写查询先在本地完成

界面、领域逻辑、查询与事务都在浏览器里闭环运行。离线照常可用,联网再按需同步。

Local-first
UI 与交互层

页面状态、表单和详情页直接消费本地查询结果,不必为每次读写等接口往返。

本地业务与模型层

实体规则、关系约束、查询构造与副作用在浏览器里闭环执行。

本地数据库层

SQLite + OPFS 负责事务、索引、查询执行与持久化。

交互优先本地执行
体验不被网络往返拖慢。
版本按分支流转
撤销、重做、分支与历史围绕数据版本组织。
同步按需触发
联网后再 pull / push,不是每次读写都走服务端。
sync lane
Push

把本地提交、分支状态和需要共享的数据推到远端。

Pull

拉回远端最新变更,合并到本地数据流。

VERSION-LEVEL SYNC
remote role

远端同步仓库

远端更像共享仓库或同步中继点,负责交换版本与变更,不替浏览器执行业务主流程。

保存可共享的版本历史与同步状态
为多设备或多成员提供交换点
只通过 pull / push 同步,不接管本地业务执行
tech stack03

核心技术选型

每一层都服务于同一个目标——让数据应用真正跑在浏览器里

本地存储执行层

SQLite

轻量、稳定、久经验证,覆盖大多数浏览器端结构化数据场景。

高级查询执行层

PGlite

在浏览器里提供接近 PostgreSQL 的能力,胜任复杂查询与扩展需求。

模型与类型约束

TypeScript

让模型定义、生成代码和消费端 API 始终对齐,把错误挡在编译期。

核心响应式主线

RxJS

查询结果、变更事件、副作用共用一条响应式主线——是系统骨架,不是可选配件。

可选持久化增强

OPFS

支持时用 OPFS 获得更可靠的本地文件持久化,不支持时自动回退其他 VFS。

代码生成引擎

ts-morph

基于 TypeScript AST,把实体元数据翻译成类型、查询构建器与框架适配代码,是生成链路的执行核心。

capabilities04

已落地的能力

以下能力都可以在文档、demo 和源码里直接验证

模型驱动开发

用元数据描述模型,把查询、表单和类型安全从模型一层层向外推导。

已实现
实体元数据
关系建模
类型安全 CRUD
响应式查询自动更新

跨框架统一 API

三个主流框架共享相同业务语义,差异只保留在 UI 绑定层。

已实现
Angular Signals
React Hooks
Vue Composables
RxJS Observable 通用支持

代码生成链路

从模型定义自动产出类型和辅助代码,省掉重复手写与随之而来的错误。

已实现
完整类型推断
查询构建器
实体辅助代码
框架封装输出

性能基础设施

围绕浏览器内数据库、Worker 和缓存组织性能边界,不只是在渲染层打补丁。

已实现
Worker 支持
OPFS 优先持久化
查询缓存
WASM 数据库执行

版本与同步基础

协作层已覆盖版本分支、撤销重做与条件同步,重点是本地版本流转可复验。

MVP 已验证
Branch 管理
撤销重做
跨 Tab 同步
多种同步策略
code path05

关键代码路径

从模型到界面,主链路要短、要稳、可复现

1. 定义模型边界
typescript
const TodoEntity: EntityMetadataOptions = {
name: 'Todo',
displayName: 'Todo',
repository: 'Repository',
extends: ['EntityBase'],
properties: [
{ name: 'title', type: PropertyType.string },
{ name: 'completed', type: PropertyType.boolean, default: false },
{ name: 'createdAt', type: PropertyType.date }
]
};
2. 生成稳定接口
bash
nx run rxdb-client-generator:generate

# 输出内容包括:
# - 实体类型定义
# - CRUD 与查询辅助代码
# - 框架集成封装
# - 关系映射与表单支持
3. 把查询接入界面
typescript
Todo.find({
where: {
combinator: 'and',
rules: [{ field: 'completed', operator: '=', value: false }]
}
}).subscribe(todos => {
console.log('未完成任务:', todos);
});
4. 复用同一套查询语义
3 frameworks
HOOKSReact
const { value: todos } =
useFind(Todo, { where: {...} });
COMPOSABLESVue
const { value: todos } =
useFind(Todo, { where: {...} });
SIGNALSAngular
const { value: todos } =
useFind(Todo, { where: {...} });
相同的模型与查询语义,差异只集中在各框架的 UI 绑定上。

从模型出发,而不是从页面状态出发

这套架构要解决的,是复杂前端里数据规则无处安放的问题。先跑 demo 再回到文档,更容易判断它是否适合你的系统。

查看在线演示