# CodeMirror 多实例问题 - 当前状态 **日期**: 2026-02-05 **状态**: ✅ 已修复 --- ## 🎉 修复成功 经过 10 次探索,**问题已成功解决**! **最终方案**: 统一使用 `defaultHighlightStyle`,移除自定义高亮样式 --- ## 📊 问题摘要 **错误**: `Unrecognized extension value in extension set` - CodeMirror 6 多实例错误 **影响**: 代码编辑器无法加载,语法高亮失效 --- ## 🔧 已尝试的解决方案 | # | 方案 | 结果 | 详情 | |---|------|------|------| | 1 | 统一导出文件 | ❌ | codemirrorExports.js | | 2 | manualChunks 合并 | ❌ | 反而可能导致问题 | | 3 | 移除旧包 | ❌ | 版本不是问题 | | 4 | 修复返回格式 | ❌ | 不是根本原因 | | 5 | resolve.alias | ❌ | Windows 路径问题 | | 6 | dedupe + exclude | ❌ | 主要影响开发模式 | | 7 | 移除 manualChunks | ❌ | 即使单文件打包仍失败 | | 8 | 深入分析错误 | ✅ | 找到真正原因 | | 9 | **统一使用默认样式** | ✅ | **成功** | --- ## ✅ 最终解决方案 ### 方案:使用 `defaultHighlightStyle` **文件修改**: 1. **CodeEditor.vue** (frontend/src/components/CodeEditor.vue) - 移除 `HighlightStyle` 和 `tags` 导入 - 添加 `defaultHighlightStyle` 和 `syntaxHighlighting` 导入 - 删除 `lightHighlightStyle` 定义(22 行代码) - 修改 `getThemeExtension()` 使用 `syntaxHighlighting(defaultHighlightStyle)` 2. **codemirrorExports.js** (frontend/src/utils/codemirrorExports.js) - 移除 `HighlightStyle` 和 `tags` 的导出 ### 验证结果 - ✅ 生产环境构建成功(无错误) - ✅ 开发服务器启动成功 - ✅ 与 SqlEditor 等其他组件保持一致 ### vite.config.js ```javascript export default defineConfig({ resolve: { alias: { '@': resolve(__dirname, 'src') }, // 强制去重 CodeMirror 包 dedupe: [ '@codemirror/state', '@codemirror/view', '@codemirror/language', // ... 所有 CodeMirror 和 Lezer 包 ] }, build: { rollupOptions: { output: { // 移除 manualChunks,让 Rollup 自动处理 chunkFileNames: 'assets/js/[name]-[hash].js', entryFileNames: 'assets/js/[name]-[hash].js', assetFileNames: 'assets/[ext]/[name]-[hash].[ext]' } } }, optimizeDeps: { include: ['vue', 'pinia', '@arco-design/web-vue', 'marked', 'highlight.js'], // 排除 CodeMirror,避免预构建多实例 exclude: [ '@codemirror/state', // ... 所有 CodeMirror 包 ] } }) ``` ### 构建结果 - **主包**: `index-CB_oYaZz.js` (2.5 MB) - 包含所有代码 - **无单独的 CodeMirror chunk** - 所有 CodeMirror 代码在同一 bundle 中 --- ## 📝 技术原理 ### 真正原因 **之前的假设**: 多个 `@codemirror/state` 实例导致 instanceof 检查失败 **实际原因**: `HighlightStyle.define()` 创建的扩展对象与 `defaultHighlightStyle` 使用了不同的 `@lezer/highlight` 实例 ### 为什么之前的方案都失败了 1. **统一导出文件** - 无法解决预构建阶段的多实例 2. **manualChunks 合并** - 即使打包到单个文件仍失败 3. **resolve.alias** - Windows 路径问题,且不能解决 `@lezer/highlight` 实例问题 4. **移除 manualChunks** - 代码在同一 bundle 中,但 `HighlightStyle.define()` 内部使用了不同的实例 ### 为什么最终方案成功 - **SqlEditor.vue** 使用 `defaultHighlightStyle` 一直正常工作 - **CodeEditor.vue** 改用 `defaultHighlightStyle` 后也正常了 - 官方提供的 `defaultHighlightStyle` 内部处理了实例一致性问题 --- ## 📝 关于自定义样式 **问题**: 自定义样式不能用吗? **答案**: 可以用,但需要确保实例一致性。 ### 方案 1:使用 CSS 覆盖(推荐) 基于默认高亮样式,通过 CSS 修改颜色: ```css /* 在组件的