Backstage v1.44.0 版本特性全解析:Scaffolder 3.0 重构、新前端测试范式与 BUI 设计系统演进
【免费下载链接】backstageBackstage is an open framework for building developer portals项目地址: https://gitcode.com/GitHub_Trending/ba/backstage
导读
本文基于 Backstage 官方仓库的 v1.44.0 发布说明,系统解读该版本中的破坏性变更、新增能力与升级路径:包括 Scaffolder 后端插件的 3.0 大版本重构、renderTestApp新测试工具、外部服务间认证(service-to-service auth)自定义 token handler、Material UI 到 Backstage UI 的迁移助手插件,以及 HTTP 服务器低层参数的配置化支持。读完本文,你将明确 v1.44.0 升级时的必改项(如全局 CSS 引入、scaffolderActionsExtensionPoint导入路径迁移),并掌握新特性的具体用法与源码级实现依据。
一、Scaffolder Backend 3.0:大版本重构与扩展点迁移
v1.44.0 最大的变化集中在 Scaffolder 后端插件。该版本正式进入 3.0,核心动作是清理历史遗留类型并开始为后续的架构重构铺路。
破坏性变更:移除过期类型与TaskBroker接口收紧
移除的已废弃类型:CreateWorkerOptions、CurrentClaimedTask、DatabaseTaskStore、TaskManager等旧类型与接口已被删除,凡在自定义代码中引用这些符号的都需要同步迁移。
TaskBroker接口新增必选方法:TaskBroker接口现在要求实现cancel、recoverTasks、retry三个方法。如果你的自定义TaskBroker实现用不到这些能力,可以直接用no-op函数(() => void)占位。值得留意的是,官方在发布说明中明确表示正在考虑彻底移除TaskBroker扩展点,并希望社区通过 issue 反馈使用场景,以支撑后续scaffolder-backend插件的重新架构(re-architecture)。
scaffolderActionsExtensionPoint从/alpha晋升为主导出
用于注册 scaffolder action 的扩展点此前位于 alpha 子路径,现在移入主导出,导入路径必须更新:
// before import { scaffolderActionsExtensionPoint } from '@backstage/plugin-scaffolder-node/alpha'; // after import { scaffolderActionsExtensionPoint } from '@backstage/plugin-scaffolder-node';从仓库源码 plugins/scaffolder-node/src/extensions.ts 可以看到该扩展点的定义,它通过createExtensionPoint创建,扩展点 ID 为scaffolder.actions,暴露addActions(...actions: TemplateAction<any, any, any>[]): void方法,供各模块向 Scaffolder 注册模板动作:
export interface ScaffolderActionsExtensionPoint { addActions(...actions: TemplateAction<any, any, any>[]): void; } export const scaffolderActionsExtensionPoint = createExtensionPoint<ScaffolderActionsExtensionPoint>({ id: 'scaffolder.actions', });批量弃用:核心任务类型进入弃用倒计时
为推进内部重构,以下公开类型已被标记为DEPRECATION(会在未来版本移除):
SerializedTaskSerializedTaskEventTaskBrokerTaskContextTaskBrokerDispatchOptionsTaskBrokerDispatchResultTaskCompletionStateTaskEventTypeTaskFilter/TaskFiltersTaskStatus
官方在发布说明中呼吁:如果这些类型支撑了你的自定义实现,请通过 Discord 或 GitHub issue 反馈具体使用场景,以便重构方案覆盖真实需求。
二、Design System:Backstage Theme 移除内置 CssBaseline
破坏性变更:UnifiedThemeProvider不再内置CssBaseline。升级后若你的 Backstage 实例界面“看起来坏了”(样式错乱),多半是因为缺少新版 Backstage UI 的全局 CSS。修复方式是在应用入口 packages/app/src/index.tsx 中显式导入:
import '@backstage/ui/css/styles.css';同时,原本用于关闭 CssBaseline 的noCssBaselineprop 因变得冗余而被移除。
实践建议:升级到 v1.44.0 时,应把全局 CSS 导入作为首个验证项,尤其当应用自定义了主题或对基线样式有依赖时,这一步不可省略。
三、Design System:Backstage UI 组件库更新
新增Dialog组件与菜单虚拟化
- 新增
Dialog组件:由社区贡献(PR #31371),为 Backstage UI 补充了对话框能力。 - 菜单虚拟化:
Menu、MenuListBox、MenuAutocomplete、MenuAutocompleteListBox新增virtualized、maxWidth、maxHeight三个 props,用于对长列表菜单进行虚拟化渲染,解决大量选项时的性能问题。
破坏性变更:PasswordField、CSS Modules、ScrollArea与 Icon 移除
- 新增
PasswordField组件(PR #31238):TextField上的password与search类型被移除,密码输入改为专用组件。从源码看,PasswordField拥有独立的样式文件与 story 示例(见 packages/ui/src/components/PasswordField/),并提供了显示/隐藏密码的可见性切换控件(bui-PasswordFieldVisibility)。 - CSS Modules 化:Backstage UI 组件样式全面改为 CSS Modules 加载(生成类名),不再使用纯 CSS。官方强调这通常不会带来实际问题,但仍保留了各组件的固定类名(如
bui-PasswordField这类前缀),方便开发者继续对实例进行样式定制。 - 移除
ScrollArea组件:原因是它未达到项目的无障碍(accessibility)标准。 - 移除 Icon 组件:该组件对 tree-shaking 造成了阻碍,官方建议在找到更优方案前,直接使用
@remixicon/react的图标。
四、前端测试范式变更:renderTestApp取代extensions选项
破坏性变更:renderInTestApp的extensions选项被移除——它会导致新旧前端世界(old/new frontend world)被混用的混乱效果。若需要在测试应用中注入 extensions,应改用新的renderTestApp工具。
从仓库源码 packages/frontend-test-utils/src/app/renderTestApp.tsx 可以看到,renderTestApp的 options 中重新引入了extensions?: ExtensionDefinition<any>[],并在内部将传入的 extensions 组装进测试应用后渲染,从而保证测试环境与生产环境使用一致的扩展机制:
// 用法示意 renderTestApp({ extensions: [...], });迁移要点:凡是在插件测试里使用
renderInTestApp({ extensions })的地方,都需要改写为renderTestApp,以确保扩展按新前端系统的规则加载。
五、Backstage CLI:Yarn 插件自动检测与--entrypoint自定义入口
Yarn 插件自动检测
yarn new生成新包时,新增了对 Backstage Yarn 插件的自动检测与支持:当检测到插件已安装,新包会自动为@backstage/*依赖使用backstage:^版本范围,省去手动维护版本号的麻烦。
App 入口自定义:--entrypoint
package start命令新增--entrypoint选项,用于指定开发应用的自定义入口目录/文件。这在为同一插件维护多套 dev app(如 stable 与 alpha 两个版本)时尤其有用。以如下 dev 目录结构为例:
dev/ index.tsx alpha/ index.ts- 默认
yarn package start:以dev/为入口,执行dev/index.tsx; yarn package start --entrypoint dev/alpha:以dev/alpha/为入口,执行dev/alpha/index.ts。
该能力在 packages/cli/CHANGELOG.md 的对应条目中有完整记录,--entrypoint <string>也出现在 CLI 报告中(packages/cli/cli-report.md)。
六、服务间认证新能力:自定义外部 token handler
v1.44.0 新增了external token handler这一服务引用(service ref),允许采用方为发送到后端插件的授权 token 注册自定义处理器。也就是说,如果你的组织在后端生态中已经有既定的服务到服务认证方式,现在可以无缝地让 Backstage 也接受这些 token,与既有对静态 token和JWKS 基础 token的支持形成互补。
该能力对应的完整文档位于仓库 docs/auth/service-to-service-auth.md。这一特性对有存量微服务体系的团队意义重大——无需改造现有认证体系即可接入 Backstage 后端插件。
七、新插件:Themer(MUI v5 主题 → BUI 迁移助手)
v1.44.0 带来了一个 Material UI 到 Backstage UI 的迁移辅助插件Themer(对应仓库中的@backstage/plugin-mui-to-bui,见 plugins/mui-to-bui/README.md)。
- 新增页面路由
/mui-to-bui; - 将现有MUI v5 主题转换为 Backstage UI(BUI)CSS 变量;
- 提供实时预览(live preview)与复制/下载能力;
- 插件包名为
@backstage/plugin-mui-to-bui,安装命令:yarn --cwd packages/app add @backstage/plugin-mui-to-bui。
对于正在向新设计系统迁移的实例,这是一个把主题转换成本显著降低的实用工具。
八、新前端系统:放宽 lint 规则以支持插件间导入
此前,内置 lint 规则禁止前端插件包导入其他前端插件包——这类依赖通常应下沉到-react或-common包中。
但在新前端系统中,扩展与适配其他插件成为常见需求,这天然意味着要在代码中导入对应插件。因此 v1.44.0 放宽了 lint 规则,支持这种特定场景,前提是两个包的插件 ID 相同。
实际效果:你可以创建一个(内部的)前端插件包供应用导入,再由该内部包导入你要适配的开源插件——适配代码不再被迫塞进 app 内部,结构更清晰、更易复用。
九、TechDocs CLI:serve支持实时重载
TechDocs CLI 及其嵌入式应用现在接入了mkdocs的 live reload 支持。运行techdocs-cli serve时,文档源文件的修改可以即时反映到预览中,显著提升本地编写与预览 TechDocs 的效率。
十、通过配置直接设置 HTTP 服务器选项
v1.44.0 让你可以直接从app-config中设置后端的低层 HTTP 服务器选项(如请求超时),无需再改写 root HTTP router 服务。对应服务文档位于仓库 docs/backend-system/core-services/root-http-router.md,其配置示意如下(支持数字毫秒、ms字符串、ISO 时长字符串与时长对象等多种格式):
backend: server: # (Optional) HTTP server configuration, Node.js defaults apply otherwise headersTimeout: 60000 requestTimeout: '30s' keepAliveTimeout: { seconds: 5 } timeout: 'PT30S' # Numeric-only settings maxHeadersCount: 2000 maxRequestsPerSocket: 100若需要更细粒度的控制,仍可通过代码方式在createBackend中配置rootHttpRouterServiceFactory的configure回调,配合applyDefaults辅助函数保留默认 app/router 配置、仅定制 Node.js HTTP Server 的超时等底层参数:
backend.add( rootHttpRouterServiceFactory({ configure: ({ server, applyDefaults }) => { // apply default app/router configuration applyDefaults(); // customize the Node.js HTTP Server timeouts server.keepAliveTimeout = 65 * 1000; server.headersTimeout = 66 * 1000; }, }), );这一特性让运维侧无需编写自定义服务实现,即可统一在配置文件里管理请求超时等行为。
十一、安全修复与升级路径
本版本不包含任何安全修复(Security Fixes: none),因此安全相关的升级决策可参考其他渠道的公告。
官方建议保持 Backstage 项目持续更新到最新版本,完整的升级指引见 docs/getting-started/keeping-backstage-updated.md,完整的逐条变更记录见 docs/releases/v1.44.0-changelog.md。
升级核对清单
综合以上变更,从 v1.43.x 升级到 v1.44.0 建议按如下顺序自查:
- Scaffolder 相关:更新
scaffolderActionsExtensionPoint导入路径到主导出;处理被移除的废弃类型;为自定义TaskBroker补齐cancel/recoverTasks/retry(可 no-op);评估是否依赖被弃用的任务类型。 - 应用入口:在 packages/app/src/index.tsx 引入
@backstage/ui/css/styles.css,并移除noCssBaseline相关代码。 - UI 组件:将
TextField的password/search类型迁移到PasswordField;检查是否使用了已移除的ScrollArea与 Icon 组件(图标改用@remixicon/react)。 - 测试代码:将
renderInTestApp({ extensions })迁移到renderTestApp。 - 插件开发:如维护 stable/alpha 双版本 dev app,可尝试
yarn package start --entrypoint dev/alpha;新前端插件间的导入适配,确认插件 ID 相同以通过 lint。 - 后端运维:如需要,直接在
app-config.yaml的backend.server下配置超时等 HTTP 服务器选项。
以上每一项都可对照本仓库对应源码与文档进一步深入,例如 Scaffolder 扩展点定义见 plugins/scaffolder-node/src/extensions.ts,测试工具实现见 packages/frontend-test-utils/src/app/renderTestApp.tsx,HTTP 服务器配置见 docs/backend-system/core-services/root-http-router.md。
【免费下载链接】backstageBackstage is an open framework for building developer portals项目地址: https://gitcode.com/GitHub_Trending/ba/backstage
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考