Luma 多端架构#
Luma 使用一套 React/Vite 界面,通过 Tauri 2 交付 macOS、Windows、iOS 和 Android。平台差异必须留在适配层,不能复制四份阅读器组件。
目标结构#
apps/
web/ 共享 React UI;浏览器开发入口
luma/ Tauri 2 原生壳与平台配置
api/ 当前 Node 本地服务;迁移期间保留
sync-server/ 远端操作日志与 provider 服务
packages/ 后续逐步抽离的纯 TypeScript 业务包
reader-core/ 正文、翻译块、阅读状态
data-core/ Repository 接口、模型与迁移
sync-core/ HLC、字段时钟、冲突合并
不可破坏的边界#
apps/web不直接判断 macOS、Windows、iOS 或 Android;只调用平台接口。- UI 不直接依赖
better-sqlite3,也不直接持有文件系统路径。 - API Key、同步 token 使用系统安全存储,不进入 SQLite 或前端构建产物。
- 每台设备保留自己的 SQLite;服务器只交换操作和可选的大对象。
- 正文、媒体、翻译与向量索引默认按设备缓存,不强制同步。
- 桌面、平板和手机共用组件,只允许响应式布局和平台能力有差异。
迁移阶段#
Stage 1:原生壳与平台边界#
- Tauri 2 壳复用
apps/web的 Vite 输出。 - 保留浏览器模式和当前 Node API,确保现有功能不回退。
- 建立
platform接口,统一 API transport、外链、剪贴板和平台识别。 - 增加桌面、平板、手机的安全区和输入方式适配。
Stage 2:本地 Repository#
- 将 feed、item、knowledge、sync 的 SQL 从 Hono handler 中抽到 Repository。
- 浏览器开发模式使用 HTTP Repository。
- Tauri 使用原生 SQLite Repository。
- 数据库 schema 和迁移由共享版本号管理。
Stage 3:后台与系统能力#
- 桌面端支持常驻抓取、菜单、快捷键、自动更新。
- iOS/Android 使用系统允许的后台刷新,不假设进程永久存活。
- 接入系统分享、通知、文件选择和安全密钥存储。
Stage 4:发布#
- macOS 为第一发布目标,随后 Windows。
- iPad 先完成双栏和键盘/触控,再覆盖 iPhone。
- Android 与 iPhone 共用移动布局,只保留系统返回、分享和文件入口差异。
功能可用性#
| 能力 | Web 开发 | macOS | Windows | iOS/iPadOS | Android |
|---|---|---|---|---|---|
| 共享阅读 UI | 是 | 是 | 是 | 是 | 是 |
| 本地 SQLite | 当前由 API 提供 | 原生 | 原生 | 原生 | 原生 |
| 离线阅读 | 部分 | 是 | 是 | 是 | 是 |
| 后台持续抓取 | 浏览器限制 | 是 | 是 | 系统调度 | 系统调度 |
| Obsidian 目录双向同步 | 本机 API | 是 | 是 | 文件授权后 | 文档授权后 |
| Luma Sync | 是 | 是 | 是 | 是 | 是 |