# Monaco Editor 差异对比功能使用指南 ## 📦 安装依赖 在项目根目录执行以下命令安装 Monaco Editor: ```bash npm install monaco-editor @monaco-editor/react ``` ### 依赖说明 - **monaco-editor**: Monaco Editor 核心包(VS Code 的编辑器组件) - **@monaco-editor/react**: Monaco Editor 的 React 封装,提供 React 组件 ## 🚀 快速开始 ### 1. 访问演示页面 启动项目后,访问:`http://localhost:5173/monaco-demo` ### 2. 查看效果 页面会展示两份合同的差异对比: - **左侧**:原始合同(2024年1月版本) - **右侧**:修改后的合同(2024年3月版本) ### 3. 使用导航功能 - **上一处差异**:跳转到前一个修改位置 - **下一处差异**:跳转到后一个修改位置 - **重置示例**:恢复默认的示例文本 ## 🎨 差异高亮说明 | 颜色 | 含义 | 示例 | |------|------|------| | 🟢 **绿色** | 新增的行 | `+ 第七条 保密条款(新增)` | | 🔴 **红色** | 删除的行 | `- 第八条 其他约定` | | 🟡 **黄色** | 修改的内容 | `总金额:1,000,000 → 1,500,000` | ## 📂 文件结构 ``` app/ ├── routes/ │ └── monaco-demo.tsx # Monaco 演示页面 └── docs/ └── monaco-editor-使用指南.md # 本文档 ``` ## ⚙️ 配置说明 ### DiffEditor 主要配置项 ```typescript ``` ### 常用选项 | 选项 | 说明 | 可选值 | |------|------|--------| | `readOnly` | 是否只读 | `true` / `false` | | `renderSideBySide` | 并排/内联显示 | `true`(并排) / `false`(内联) | | `ignoreTrimWhitespace` | 忽略首尾空格 | `true` / `false` | | `fontSize` | 字体大小 | 数字,如 `14` | | `wordWrap` | 自动换行 | `'on'` / `'off'` / `'wordWrapColumn'` | | `theme` | 主题 | `'vs'`(浅色) / `'vs-dark'`(深色) / `'hc-black'`(高对比度) | ## 🔧 高级功能 ### 1. 获取差异信息 ```typescript const handleEditorDidMount = (editor: editor.IStandaloneDiffEditor) => { // 获取所有差异 const lineChanges = editor.getLineChanges(); console.log('差异数量:', lineChanges?.length); console.log('差异详情:', lineChanges); }; ``` ### 2. 跳转到指定差异 ```typescript const goToDiff = (index: number) => { const lineChanges = diffEditorRef.current?.getLineChanges(); if (!lineChanges || index >= lineChanges.length) return; const change = lineChanges[index]; const modifiedEditor = diffEditorRef.current.getModifiedEditor(); // 跳转并高亮 modifiedEditor.revealLineInCenter(change.modifiedStartLineNumber); modifiedEditor.setPosition({ lineNumber: change.modifiedStartLineNumber, column: 1 }); }; ``` ### 3. 切换显示模式 ```typescript // 切换为内联模式 ``` ## 📊 实际应用场景 ### ✅ 适用场景 1. **合同对比**:版本管理、条款变更追踪 2. **代码审查**:代码变更对比 3. **文档版本控制**:历史版本对比 4. **配置文件对比**:JSON、YAML 配置变更 ### ⚠️ 限制 - 只能对比**纯文本** - 不支持直接对比 PDF、Word 等格式化文档 - 需要先提取文本内容 ## 🔄 扩展:文件上传功能 ### 未来可以添加的功能 1. **上传 PDF 文件** → 提取文本 → 对比 2. **上传 Word 文件** → 提取文本 → 对比 3. **导出差异报告** → PDF/Word 格式 4. **保存对比结果** → 数据库存储 ### 文本提取示例 ```typescript // PDF 文本提取(需要 pdf-parse 或 pdfjs) import * as pdfjsLib from 'pdfjs-dist'; async function extractPdfText(file: File): Promise { const arrayBuffer = await file.arrayBuffer(); const pdf = await pdfjsLib.getDocument(arrayBuffer).promise; let text = ''; for (let i = 1; i <= pdf.numPages; i++) { const page = await pdf.getPage(i); const content = await page.getTextContent(); text += content.items.map(item => item.str).join(' ') + '\n'; } return text; } // Word 文本提取(需要 mammoth) import mammoth from 'mammoth'; async function extractWordText(file: File): Promise { const arrayBuffer = await file.arrayBuffer(); const result = await mammoth.extractRawText({ arrayBuffer }); return result.value; } ``` ## 📝 示例代码位置 完整代码请查看:`app/routes/monaco-demo.tsx` ### 核心代码片段 ```typescript // 1. 引入组件 import { DiffEditor } from "@monaco-editor/react"; // 2. 定义文本 const originalText = "原始合同内容..."; const modifiedText = "修改后的合同内容..."; // 3. 渲染 Diff Editor ``` ## 🎯 性能优化建议 1. **大文件处理**:文本超过 10MB 时,考虑分段加载 2. **虚拟滚动**:Monaco 自带虚拟滚动,支持大文件 3. **懒加载**:使用 React.lazy 懒加载 Monaco 组件 4. **Web Worker**:文本提取放在 Worker 中处理 ## 🐛 常见问题 ### Q1: Monaco Editor 加载慢? **A**: Monaco Editor 体积较大(~5MB),建议: - 使用 CDN 加速 - 开启 gzip 压缩 - 使用代码分割 ### Q2: 中文显示乱码? **A**: 确保文件编码为 UTF-8: ```typescript const text = await file.text(); // 自动识别编码 ``` ### Q3: 如何自定义主题? **A**: 使用 `defineTheme` 自定义: ```typescript import { editor } from 'monaco-editor'; editor.defineTheme('myCustomTheme', { base: 'vs', inherit: true, rules: [{ background: 'EDF9FA' }], colors: { 'editor.foreground': '#000000', 'editor.background': '#EDF9FA', // ... 更多颜色配置 } }); ``` ## 📚 参考资料 - [Monaco Editor 官方文档](https://microsoft.github.io/monaco-editor/) - [@monaco-editor/react 文档](https://github.com/suren-atoyan/monaco-react) - [VS Code API 文档](https://code.visualstudio.com/api) ## 🚧 后续开发计划 - [ ] 添加文件上传功能 - [ ] 支持 PDF 文本提取 - [ ] 支持 Word 文本提取 - [ ] 添加差异统计图表 - [ ] 导出对比报告(PDF/Word) - [ ] 保存对比历史记录 - [ ] 支持多人协同对比 --- **作者**: 中国烟草AI合同及卷宗审核系统开发团队 **更新时间**: 2025-01-24