在标注平台项目中集成 LabelStudio 编辑器,用于实现数据标注功能。
症状:整个标注界面被一个橙色渐变覆盖,无法交互
根本原因:
relations-overlay 是 LabelStudio 的关系标注覆盖层(SVG 元素)解决方案: 在组件样式中添加透明背景:
: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.scssweb/apps/lq_label/src/views/annotation-view/annotation-view.module.scss症状:
根本原因:
LabelStudio 使用 CSS 模块和 BEM 命名约定,所有 CSS 类名需要添加 lsf- 前缀:
<div class="lsf-label">...</div>.label { ... } → 需要转换为 .lsf-label { ... }技术细节:
web/webpack.config.js 有特殊的 CSS 模块配置.module.scss 的 SCSS 文件添加 lsf- 前缀配置代码:
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 中添加相同的配置:
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重要提示:
playground 和 labelstudio 应用的实现main.tsx 的样式导入顺序relations-overlay 和 lsf-container 类名lsf- 前缀的类名lsf- 前缀的类名webpack.config.jslocalIdentName 配置lsf- 前缀的转换逻辑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 - 规范索引playground 应用是最好的参考webpack.config.js 包含关键配置localIdentName 配置决定转换规则✅ 橙色遮罩消失 ✅ 所有样式正确显示 ✅ 标签按钮有颜色和边框 ✅ 悬停和选中效果正常 ✅ 侧边栏和面板样式正确 ✅ 编辑器完全可用
启动开发服务器:
cd web
yarn nx serve lq_label
访问测试页面:
点击 "🧪 编辑器测试" 按钮
访问标注页面:
创建项目和任务
感谢 LabelStudio 团队提供的优秀编辑器! 感谢 playground 和 labelstudio 应用提供的参考实现!
文档创建时间:2026-01-13 最后更新时间:2026-01-13 维护者:项目开发团队