关于 creating-backstage-extension-blueprint
creating-backstage-extension-blueprint 是指导 Backstage 前端插件作者构建可扩展 UI 贡献机制的 Skill,适用于希望其他插件或模块注册界面的场景。它说明如何配套定义 blueprint 与收集贡献的父扩展,并区分前端 blueprint 和后端扩展点。
主要功能
- 01指导定义类型化前端 blueprint
- 02构建收集贡献的父扩展
- 03说明输出数据与可选数据引用
- 04配置贡献项的用户设置
- 05涵盖参数类型推断与工厂写法
适用场景
- 01为插件提供可注册的仪表板面板
- 02允许模块向结果页添加检查项
- 03让模块为功能标志贡献界面
- 04为表单或目录页面扩展 UI
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ vinzscam/ backstage-skills --skill creating-backstage-extension-blueprint安装后在 Claude Code 中输入/creating-backstage-extension-blueprint确认已加载。
附带文件references/defining-the-blueprint.mdreferences/parent-collecting-extensions.md
详细介绍
创建前端扩展蓝图
何时使用此技能
你正在编写一个前端插件,并希望为其他插件或模块提供一种类型安全、结构化的方式,让它们能够向该插件贡献 UI。比如:
- 一个仪表盘插件,希望模块能注册自定义仪表盘面板
- 一个代码质量插件,希望模块能注册显示在结果页上的其他检查项
- 一个可复用的“功能标志”插件,让模块为每个标志贡献 UI 控件
Backstage 本身也使用了相同模式,例如 PageBlueprint、EntityCardBlueprint、EntityContentBlueprint、FormFieldBlueprint、ApiBlueprint。你要为自己的插件创建这样一个蓝图。
不要在以下情况下创建蓝图:
- 已有内置蓝图可以满足需求(例如,目录页卡片使用
EntityCardBlueprint,scaffolder 字段使用FormFieldBlueprint等) - 扩展点只会触发一次,并且只有你的插件会向其中添加内容——直接编写常规扩展,省去蓝图这一层
- 你正在编写后端插件——后端使用扩展点(
createExtensionPoint),而不是蓝图。请参阅using-backstage-backend-system/references/extension-points.md
要构建的内容
蓝图由两个相互关联的部分组成:
- 蓝图本身(
createExtensionBlueprint)——类型安全的工厂,其他插件可以调用MyBlueprint.make({ name, params })来贡献单个实例。 - 父扩展——声明
input,并渲染或使用附加到该输入的所有内容。通常,这是你在插件的extensions.tsx中定义的PageBlueprint扩展。
两部分缺一不可,并且必须对输入名称以及贡献所生成的数据引用保持一致。大多数插件会在同一个 extensions.tsx 文件(或同目录下的模块)中编写这两部分。
选择合适的模式
| 要构建的内容 | 参考资料 |
|---|---|
蓝图本身(createExtensionBlueprint 定义) | references/defining-the-blueprint.md |
通过 inputs 收集贡献内容的父扩展 | references/parent-collecting-extensions.md |
两种调用模式
- 独立使用:编辑现有前端插件,以添加新蓝图或完善现有蓝图。
- 脚手架后(由
creating-backstage-plugin针对frontend-plugin调用):较为少见——仅在用户明确表示“我希望我的插件可以由其他模块扩展”时使用。大多数插件不需要此模式,也不应采用。
常见注意事项
- 蓝图位于前端。后端对应的是
createExtensionPoint——API 不同,包也不同。如果你既想实现可扩展的 UI,又想实现可扩展的后端行为,就需要分别创建两者,并使用不同的符号和文档。 - 蓝图的
attachTo必须指向同一插件extensions数组中某个实际扩展声明的输入。ID 或输入字符串不匹配会导致静默的“无贡献”——蓝图可以编译,但永远不会有任何内容附加到它上面。 - 谨慎选择
output——这里定义了每个贡献都必须提供的数据引用。如果蓝图要求coreExtensionData.reactElement和自定义数据引用,那么每个使用方的工厂都必须提供两者。之后再添加必需的数据引用会对使用方造成破坏性变更。 - 使用
dataRefs定义可选的命名访问器,供父级读取贡献中的数据(例如,“贡献可以选择提供一个排序键,可通过MyBlueprint.dataRefs.sortKey访问”)。必需输出放在output中;可选数据或类型化的贡献数据放在dataRefs中。 configSchema允许采用方通过 app-config 覆盖每项贡献的设置,而无需修改代码。只有当贡献有面向用户的设置(标题、路径、筛选条件)时才定义它;否则跳过。factory是一个生成器——使用function* (...)并生成ref(value)调用。每个yield都会添加一项扩展数据。循环、条件判断以及看似异步的工作都会在工厂内部同步执行;真正的异步工作应放在参数传入的loader回调中。- 两阶段参数(
createExtensionBlueprintParams)——对于参数必须采用函数形式的蓝图(例如{ field: () => Promise<...> }),请使用createExtensionBlueprintParams包装,以便使用方获得类型推断。真实示例请参阅../backstage/plugins/scaffolder-react/src/next/blueprints/FormFieldBlueprint.tsx中的FormFieldBlueprint。 make与makeWithOverrides:使用方通常调用MyBlueprint.make({ name, params })。更高级的使用方可以通过makeWithOverrides覆盖factory,以包装原工厂——当在蓝图上添加inputs:时会用到。请在 README 中说明make;仅在高级场景下提及makeWithOverrides。
评论
支持 Markdown