当前项目使用:
| 工具 | 版本或范围 |
|---|---|
| Node.js | 使用团队当前 LTS 版本 |
| React | 18.3.1 |
| TypeScript | 6.0.x,strict 模式 |
| Vite | 8.x |
| Ant Design | 5.22.x |
| Zustand | 4.5.x |
安装并启动:
npm install
npm run dev
不要根据旧文档安装 @mdxeditor/editor、Slate、@dnd-kit、react-window 或 use-debounce,这些不是当前项目依赖。
src/
├── components/
│ ├── ChatPanel/
│ ├── Editor/
│ │ ├── blocks/
│ │ ├── RichTextEditor/
│ │ └── toolbar/
│ ├── EditorPanel/
│ ├── ExportRecordList/
│ ├── Layout/
│ └── SessionList/
├── hooks/
├── services/
├── stores/
├── types/
└── utils/
编辑器相关职责:
types/editor.ts:block、RichText、表格和 API 类型。stores/editorStore.ts:文档状态、修改追踪、保存和重试。services/blockService.ts:blocks API。utils/blockOperations.ts:块顺序和表格结构算法。utils/richTextConverter.ts:RichText 与 HTML 转换。utils/styleResolver.ts:Word 样式和块样式转 CSS。components/Editor/BlockRenderer.tsx:block 类型分发。新增 block 类型时至少同步修改:
src/types/editor.ts 的 BlockType 和具体接口。BlockRenderer.tsx 的分发分支。editorStore 的加载、更新和保存兼容性。保持公共组件 Props 小而明确。EditorPanelProps 是 App 与编辑器之间的稳定边界,不要为了局部功能破坏它。
RichTextEditor 使用 contenteditable,不是 Markdown 编辑器。修改它时注意:
richTextToHtml 生成内容,避免手工拼接未转义文本。htmlToRichText 读取选区和粘贴结果。Range,格式化后恢复选区。dangerouslySetInnerHTML 绕过转换器。tableContext 传递上下文,但不显示普通浮动工具栏。表格编辑必须围绕视觉坐标实现:
原始 rows/cells
-> getTableVisualCellPositions
-> 选择或计算视觉范围
-> 合并/拆分/增删操作
-> rebuildTableRows
-> 更新 metadata 和 content
修改后至少手动检查普通 2 x 2 表格、横向合并后拆分、纵向合并后拆分、横向和纵向合并同时存在、插入/删除行列后再合并,以及调整列宽和行高后保存并重新加载。
不要恢复已经删除的 TableStylePanel 或 TableBorderControl,当前需求只保留表格结构操作工具栏。
组件通过 selector 读取 store,避免订阅无关状态。编辑操作调用 updateBlock,不要在组件中直接调用 API 保存。需要立即保存时调用 store 的保存方法,并正确处理 loading、失败和取消状态。
保存相关字段包括 dirtyBlocks、failedBlocks、hasModified、isSaving、savingProgress 和 lastSaveTime。自动保存默认延迟 3 秒,保存并发限制为 3。
React.lazy 和 Suspense。mammoth 保持动态导入。content-visibility 优化。loading="lazy" 和 decoding="async"。npm run build
npm run lint
npm run format:check
npm run test
当前 package.json 中的 test:document 和 test:export 仍引用仓库中不存在的测试文件。恢复测试前不要把这两个命令当作成功的验证依据,应先修正测试脚本或补回对应测试。
生产包检查:
npm run build:analyze
npm run serve:prod
VITE_* 变量不是秘密,API key 应迁移到后端代理。