跳转至

阅读指南:不要从组件目录开始读

这份拆解参考 dg-ai-notes 的写法,不按文件名堆目录,而是按运行时问题组织章节。

三种阅读方式

方式 入口 适合谁
顺序阅读 第 1 章 → 第 12 章 想建立完整心智模型的人
请求追踪 第 2、3、6、7、9 章 想跟一条消息走完全链路的人
子系统跳读 第 4、5、8、10、11 章 想研究扩展、模型、MCP 或数据安全的人

每章的固定问题

  1. 是什么:模块的职责和边界是什么?
  2. 怎么做:入口、关键类型、状态转换和失败路径在哪里?
  3. 为什么:这个设计解决了什么跨平台、兼容性或可维护性问题?又付出了什么代价?

推荐的源码阅读顺序

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.rsmain.tsx 是因为它们分别暴露了两个世界的启动顺序。再看 types 是因为 Jan 的跨语言边界大量依赖 JSON 形状;之后才进入推理、存储和插件。

版本边界

本文以本地 jan-main 快照为准,而不是声称描述 Jan 的所有历史版本。尤其要注意:

  • package.json 使用 Yarn 4 workspaces,coreweb-appextensions/* 是 TypeScript workspace。
  • Rust crate 的应用版本是 0.8.4,插件 crate 版本不完全相同。
  • 桌面和移动端并非同一个存储实现:桌面走文件,移动端走 SQLite。
  • web-app 既可以存在于 Tauri WebView,也可以作为普通浏览器开发服务器运行;Default Service 只是让非 Tauri 场景更容易测试和开发。

读图约定

文档中的箭头表示调用或数据流,不一定表示编译期 import。跨边界时会注明:invoke 是 Tauri command 调用,event 是事件广播,ServiceHub 是前端服务抽象,Extension 是运行时能力注册。