- Framework: Vanilla JS (ES Modules) + React (部分组件)
- Build Tool: Vite
- Language: JavaScript (ES6+) / CSS3
- PDF Rendering:
pdfjs-dist - EPUB Rendering:
epubjs - Markdown Parsing:
marked - Mind Map / Whiteboard:
plait(Drawnix core),roughjs(手绘风格) - State Management: Custom Event Bus + Reactive State (Immer)
- Storage:
idb(IndexedDB wrapper),localforage
src/
├── core/ # 核心逻辑
│ ├── card-system.js # 卡片/节点管理系统
│ ├── highlight-manager.js # 高亮/标注管理器
│ ├── document-manager.js # 文档状态管理
│ └── theme-manager.js # 主题管理器
├── readers/ # 阅读器实现
│ ├── pdf-reader.js # PDF 阅读器封装
│ ├── epub-reader.js # EPUB 阅读器封装
│ ├── text-reader.js # 文本/MD 阅读器封装
│ └── pdf-*.js # PDF 相关工具 (高亮、工具栏等)
├── mindmap/ # 思维导图模块
│ ├── mindmap-view.js # 导图视图控制器
│ ├── DrawnixBoard.jsx # Drawnix 画板集成
│ └── PlaitBoard.jsx # Plait 画板组件
├── ui/ # 通用 UI 组件
│ └── split-view.js # 分屏控制器
└── styles/ # 样式文件
当前 main.js 已做过一轮较大规模的职责下沉。关于前端模块的最新职责边界、依赖方向和装配约定,请优先参考:
采用策略模式,main.js 根据文件类型实例化不同的 Reader (PDFReader, EpubReader, TextReader)。所有 Reader 需实现统一接口:
load(fileData)onPrevPage() / onNextPage()setSelectionMode(mode)(In Progress)goToLocation(loc)
- HighlightManager: 负责在文档上创建、存储和渲染高亮。它生成唯一的
highlightId。 - CardSystem: 负责管理思维导图节点。当用户从文档拖拽内容时,创建一个关联了
sourceId(文件ID) 和highlightId的卡片。 - Linkage: 通过
sourceId+highlightId实现从卡片到文档的反向定位。
使用原生 CustomEvent 进行模块间通信,解耦阅读器与导图模块。
mindmap-selection-changed: 导图节点选中时触发,通知主界面更新底部信息栏。jump-to-source: 请求跳转到文档特定位置。
- Import: 用户选择文件 -> 生成唯一 Hash ID -> 存入
state.files->openFile(). - Read & Annotate: 用户在 Reader 中选中文本 ->
HighlightManager创建高亮对象 -> 触发 UI 反馈。 - Create Node: 用户拖拽高亮 ->
CardSystem接收数据 -> 在 Drawnix 画板上创建节点。 - Persist: 所有变更通过
idb或localStorage实时写入浏览器数据库。