本地优先不等于纯文件
推荐切分:内容文件化,索引/状态仍用数据库
| 数据 | 本地 | 云端 |
|---|---|---|
| 笔记正文 | notes/{id}.md | 镜像 / 同步记录 |
| 剪藏、文章正文 | content/{id}.html / .md | 对象存储或按需保留 |
| 图片、附件 | assets/{hash}.{ext},下载一次后离线读 | 对象存储 |
| 标题、标签、排序、已读、版本 | SQLite / SwiftData | PostgreSQL |
| 搜索索引 | SQLite FTS / Spotlight | 服务端搜索 |
| 离线操作、同步队列 | SQLite outbox | Sync API |
| 账号、AI、自动化 | 不落普通文件 | PostgreSQL + Worker |
原则是所有界面先读本地、写入先落本地,后台异步同步。纯文件方案做到后面仍会被迫补一套索引、状态库和同步日志 —— 相当于自己重造一个更难维护的数据库。
Web 端同样适用,但不能依赖普通文件目录
用 IndexedDB / OPFS 做持久本地副本:UI 先显示本地内容,再静默同步。第一次打开仍需网络,之后切换访问过的内容基本不等待。
顺带要修的两条关键路径
- 页面导航不要连续访问服务器:从「等 RSC 响应 → 再请求详情 → 再加载正文」改成「先读本地缓存显示 → 后台查更新 → 无感替换」。
- 图片不要每次临时去原站抓:入库时抓一次、压缩成缩略图 / WebP、存入对象存储、页面用稳定地址,浏览器再做本地磁盘缓存。经服务端代理远程抓取时,代理要读完整个图片才返回,超时可达十几秒。