# LabelStudio 编辑器集成完整总结 ## 项目背景 在标注平台项目中集成 LabelStudio 编辑器,用于实现数据标注功能。 ## 遇到的问题 ### 问题 1:橙色到粉色的渐变遮罩 **症状**:整个标注界面被一个橙色渐变覆盖,无法交互 **根本原因**: - `relations-overlay` 是 LabelStudio 的关系标注覆盖层(SVG 元素) - 默认有一个背景色,导致遮挡了整个界面 **解决方案**: 在组件样式中添加透明背景: ```scss :global(.relations-overlay) { background: transparent !important; fill: none !important; } :global(.lsf-container) { background: transparent !important; } ``` **修改的文件**: - `web/apps/lq_label/src/views/editor-test/editor-test.module.scss` - `web/apps/lq_label/src/views/annotation-view/annotation-view.module.scss` ### 问题 2:编辑器样式完全不显示(核心问题) **症状**: - 标签按钮没有颜色 - 按钮没有边框和背景 - 面板和侧边栏样式缺失 - 整体看起来像是没有加载 CSS **根本原因**: LabelStudio 使用 CSS 模块和 BEM 命名约定,所有 CSS 类名需要添加 `lsf-` 前缀: - HTML 元素:`
...
` - CSS 文件:`.label { ... }` → 需要转换为 `.lsf-label { ... }` - 我们的 webpack 配置缺少这个转换逻辑 **技术细节**: 1. 根目录的 `web/webpack.config.js` 有特殊的 CSS 模块配置 2. 它会给所有非 `.module.scss` 的 SCSS 文件添加 `lsf-` 前缀 3. 配置代码: ```javascript cssLoader.options.modules = { localIdentName: `${css_prefix}[local]`, // css_prefix = "lsf-" getLocalIdent(_ctx, _ident, className) { if (className.includes("ant")) return className; }, }; ``` **解决方案**: 在 `web/apps/lq_label/webpack.config.js` 中添加相同的配置: ```javascript const css_prefix = 'lsf-'; // 1. 定义 CSS_PREFIX 环境变量 config.plugins = [ ...config.plugins, new webpack.DefinePlugin({ 'process.env.CSS_PREFIX': JSON.stringify(css_prefix), }), ]; // 2. 配置 CSS 模块添加 lsf- 前缀 config.module.rules.forEach((rule) => { const testString = rule.test?.toString() || ''; if (rule.test?.toString().match(/scss|sass/) && !testString.includes('.module')) { const r = rule.oneOf?.filter((r) => { if (!r.use) return false; const testString = r.test?.toString() || ''; if (testString.match(/module|raw|antd/)) return false; return testString.match(/scss|sass/) && r.use.some((u) => u.loader && u.loader.includes('css-loader')); }); r?.forEach((_r) => { const cssLoader = _r.use.find((use) => use.loader && use.loader.includes('css-loader') ); if (!cssLoader) return; const isSASS = _r.use.some((use) => use.loader && use.loader.match(/sass|scss/) ); if (isSASS) _r.exclude = /node_modules/; if (cssLoader.options) { cssLoader.options.modules = { localIdentName: `${css_prefix}[local]`, getLocalIdent(_ctx, _ident, className) { if (className.includes('ant')) return className; }, }; } }); } }); ``` **修改的文件**: - `web/apps/lq_label/webpack.config.js` **重要提示**: - 修改 webpack 配置后必须重启开发服务器 - 浏览器需要硬刷新(Ctrl+Shift+R) ## 调试过程 ### 1. 初步探索 - 参考了 `playground` 和 `labelstudio` 应用的实现 - 发现它们只导入 UI 库样式,不静态导入 editor 样式 - 修改了 `main.tsx` 的样式导入顺序 ### 2. 发现橙色遮罩 - 使用浏览器开发者工具检查元素 - 找到了 `relations-overlay` 和 `lsf-container` 类名 - 搜索源代码找到对应的组件 - 添加透明背景修复 ### 3. 样式不显示的深入调查 - 检查 Network 标签,确认 CSS 文件已加载 - 检查 CSS 文件内容,发现没有 `lsf-` 前缀的类名 - 检查 HTML 元素,发现有 `lsf-` 前缀的类名 - 意识到是 CSS 模块转换的问题 ### 4. 找到根本原因 - 阅读根目录的 `webpack.config.js` - 发现 CSS 模块的 `localIdentName` 配置 - 理解了 `lsf-` 前缀的转换逻辑 - 在我们的应用中复制了这个配置 ### 5. 验证修复 - 重启开发服务器 - 硬刷新浏览器 - 检查 HTML 和 CSS 的类名匹配 - 确认样式正确显示 ## 创建的文件 ### 测试页面 - `web/apps/lq_label/src/views/editor-test/editor-test.tsx` - 测试页面组件 - `web/apps/lq_label/src/views/editor-test/editor-test.module.scss` - 样式文件 - `web/apps/lq_label/src/views/editor-test/index.ts` - 导出文件 ### 文档 - `web/apps/lq_label/EDITOR_TEST.md` - 测试页面说明 - `web/apps/lq_label/RELATIONS_OVERLAY_FIX.md` - 橙色遮罩修复文档 - `web/apps/lq_label/CSS_PREFIX_FIX.md` - CSS 前缀问题修复文档 - `web/apps/lq_label/LABELSTUDIO_INTEGRATION_SUMMARY.md` - 本文档 ### 规范 - `.kiro/steering/labelstudio-集成规范.md` - 完整的集成规范 - `.kiro/steering/README.md` - 规范索引 ## 关键经验 ### 1. 参考成功案例 - 不要从零开始,先看看其他应用是怎么做的 - `playground` 应用是最好的参考 - 根目录的 `webpack.config.js` 包含关键配置 ### 2. 使用浏览器开发者工具 - Elements 标签:检查 HTML 元素和类名 - Network 标签:检查 CSS 文件是否加载 - Console 标签:查看错误和日志 - Styles 面板:检查样式是否被应用 ### 3. 理解 CSS 模块 - CSS 模块会转换类名 - `localIdentName` 配置决定转换规则 - LabelStudio 依赖特定的前缀 ### 4. 搜索源代码 - 使用类名搜索找到对应的组件 - 理解组件的用途和实现 - 找到样式文件和配置 ### 5. 创建测试页面 - 隔离问题,简化调试 - 添加调试面板显示状态 - 使用简单的配置和数据 ## 最终效果 ✅ 橙色遮罩消失 ✅ 所有样式正确显示 ✅ 标签按钮有颜色和边框 ✅ 悬停和选中效果正常 ✅ 侧边栏和面板样式正确 ✅ 编辑器完全可用 ## 访问测试页面 1. 启动开发服务器: ```bash cd web yarn nx serve lq_label ``` 2. 访问测试页面: - 首页:http://localhost:4200/ - 点击 "🧪 编辑器测试" 按钮 - 或直接访问:http://localhost:4200/editor-test 3. 访问标注页面: - 创建项目和任务 - 访问:http://localhost:4200/tasks/:id/annotate ## 后续工作 - [ ] 完善标注保存功能 - [ ] 添加更多的编辑器配置选项 - [ ] 实现标注历史记录 - [ ] 添加标注质量检查 - [ ] 优化编辑器性能 ## 致谢 感谢 LabelStudio 团队提供的优秀编辑器! 感谢 playground 和 labelstudio 应用提供的参考实现! --- **文档创建时间**:2026-01-13 **最后更新时间**:2026-01-13 **维护者**:项目开发团队