阅读指南:不要从组件目录开始读¶
这份拆解参考
dg-ai-notes的写法,不按文件名堆目录,而是按运行时问题组织章节。
三种阅读方式¶
| 方式 | 入口 | 适合谁 |
|---|---|---|
| 顺序阅读 | 第 1 章 → 第 12 章 | 想建立完整心智模型的人 |
| 请求追踪 | 第 2、3、6、7、9 章 | 想跟一条消息走完全链路的人 |
| 子系统跳读 | 第 4、5、8、10、11 章 | 想研究扩展、模型、MCP 或数据安全的人 |
每章的固定问题¶
- 是什么:模块的职责和边界是什么?
- 怎么做:入口、关键类型、状态转换和失败路径在哪里?
- 为什么:这个设计解决了什么跨平台、兼容性或可维护性问题?又付出了什么代价?
推荐的源码阅读顺序¶
src-tauri/src/lib.rs
→ web-app/src/main.tsx
→ web-app/src/services/index.ts
→ core/src/types/*
→ web-app/src/lib/custom-chat-transport.ts
→ web-app/src/lib/model-factory.ts
→ src-tauri/src/core/server/proxy.rs
→ src-tauri/src/core/threads/commands.rs
→ extensions/*/src/index.ts
→ src-tauri/plugins/*/src/*
先看 lib.rs 和 main.tsx 是因为它们分别暴露了两个世界的启动顺序。再看 types 是因为 Jan 的跨语言边界大量依赖 JSON 形状;之后才进入推理、存储和插件。
版本边界¶
本文以本地 jan-main 快照为准,而不是声称描述 Jan 的所有历史版本。尤其要注意:
- 根
package.json使用 Yarn 4 workspaces,core、web-app和extensions/*是 TypeScript workspace。 - Rust crate 的应用版本是
0.8.4,插件 crate 版本不完全相同。 - 桌面和移动端并非同一个存储实现:桌面走文件,移动端走 SQLite。
web-app既可以存在于 Tauri WebView,也可以作为普通浏览器开发服务器运行;Default Service 只是让非 Tauri 场景更容易测试和开发。
读图约定¶
文档中的箭头表示调用或数据流,不一定表示编译期 import。跨边界时会注明:invoke 是 Tauri command 调用,event 是事件广播,ServiceHub 是前端服务抽象,Extension 是运行时能力注册。