本地优先不等于纯文件

**「local-first(本地优先)」和「file-only(只用文件)」不是一回事。** 用户感知到的「切换笔记很卡、图片加载慢」,根因通常不是「数据库天生慢」,而是**网络请求还在切换内容的 critical path(关键路径)上**。把 PostgreSQL 换成服务器上的文件,网络等待依然存在,体验不会发生质变。

推荐切分:内容文件化,索引/状态仍用数据库

数据本地云端
笔记正文notes/{id}.md镜像 / 同步记录
剪藏、文章正文content/{id}.html / .md对象存储或按需保留
图片、附件assets/{hash}.{ext},下载一次后离线读对象存储
标题、标签、排序、已读、版本SQLite / SwiftDataPostgreSQL
搜索索引SQLite FTS / Spotlight服务端搜索
离线操作、同步队列SQLite outboxSync API
账号、AI、自动化不落普通文件PostgreSQL + Worker

原则是所有界面先读本地、写入先落本地,后台异步同步。纯文件方案做到后面仍会被迫补一套索引、状态库和同步日志 —— 相当于自己重造一个更难维护的数据库。

Web 端同样适用,但不能依赖普通文件目录

用 IndexedDB / OPFS 做持久本地副本:UI 先显示本地内容,再静默同步。第一次打开仍需网络,之后切换访问过的内容基本不等待。

顺带要修的两条关键路径

  • 页面导航不要连续访问服务器:从「等 RSC 响应 → 再请求详情 → 再加载正文」改成「先读本地缓存显示 → 后台查更新 → 无感替换」。
  • 图片不要每次临时去原站抓:入库时抓一次、压缩成缩略图 / WebP、存入对象存储、页面用稳定地址,浏览器再做本地磁盘缓存。经服务端代理远程抓取时,代理要读完整个图片才返回,超时可达十几秒。

相关