3. 插件开发基础:插件生命周期、插件类型与 Scaffolder 模板概念

在 Backstage 中,插件是功能扩展的核心单元。理解插件的生命周期、类型划分以及 Scaffolder 模板的工作方式,是进入实际开发前必须打牢的基础。本章将围绕这三个关键概念展开,帮助你建立清晰的插件开发认知模型。

3.1 插件生命周期

Backstage 插件的生命周期分为三个阶段:注册、加载和运行时。每个阶段都有明确的职责和触发时机。

阶段 触发时机 主要行为
注册 应用启动时,通过 createPlugin 或 createFrontendPlugin 等 API 注册 声明插件 ID、路由绑定、扩展点注册、依赖声明
加载 用户首次访问插件路由或触发相关扩展点时 动态导入插件模块、解析配置、初始化状态
运行时 插件激活后持续运行 处理用户交互、调用后端 API、更新 UI 状态
开发提示: 注册阶段应保持轻量,避免执行耗时操作。所有初始化逻辑应推迟到加载阶段执行,以优化应用启动性能。
Backstage 插件生命周期流程 注册阶段 createPlugin() 声明 ID / 路由 / 扩展点 加载阶段 动态导入模块 解析配置 / 初始化状态 运行时阶段 处理用户交互 调用 API / 更新 UI 说明:注册阶段仅声明插件元数据,不执行任何业务逻辑 加载阶段按需触发,运行时阶段持续响应事件

3.2 插件类型

Backstage 插件按运行环境和职责分为三种类型:前端插件、后端插件和独立插件。理解它们的差异有助于合理划分功能边界。

类型 运行环境 典型用途 示例
前端插件 浏览器(React 应用) UI 组件、页面路由、前端逻辑 Catalog 页面、TechDocs 阅读器
后端插件 Node.js 服务端 API 接口、数据处理、代理请求 Scaffolder 后端、Search 索引服务
独立插件 独立进程或容器 外部服务集成、定时任务、事件处理 Lighthouse 审计、PagerDuty 事件同步
架构原则: 前端插件只负责展示和交互,后端插件处理业务逻辑和数据持久化,独立插件用于对接外部系统。保持职责单一,避免前端插件直接调用数据库或后端插件渲染 UI。

3.3 Scaffolder 模板概念

Scaffolder 是 Backstage 内置的软件模板引擎,允许用户通过预定义的模板快速创建新项目或组件。模板本质上是一个 YAML 配置文件,描述了模板的输入参数、步骤和输出结果。

一个典型的 Scaffolder 模板包含以下核心部分:

  • metadata:模板名称、描述、标签等元信息。
  • parameters:定义用户需要输入的变量,如项目名称、语言类型、版本号等。
  • steps:按顺序执行的步骤列表,每个步骤调用一个 action(如 fetch:template、catalog:register)。
  • output:模板执行完成后返回的结果,通常包含新创建的实体引用或 URL。
# template.yaml 示例
apiVersion: scaffolder.backstage.io/v1beta3
kind: Template
metadata:
  name: react-app-template
  title: React 应用模板
  description: 创建一个新的 React 前端项目
spec:
  parameters:
    - title: 项目信息
      properties:
        projectName:
          title: 项目名称
          type: string
          description: 输入你的项目名称
        language:
          title: 编程语言
          type: string
          enum: ['TypeScript', 'JavaScript']
  steps:
    - id: fetch-base
      name: 拉取模板代码
      action: fetch:template
      input:
        url: ./skeleton
        values:
          projectName: ${{ parameters.projectName }}
    - id: register
      name: 注册到目录
      action: catalog:register
      input:
        catalogInfoUrl: ${{ steps['fetch-base'].output.result }}/catalog-info.yaml
  output:
    links:
      - title: 打开项目
        url: ${{ steps['fetch-base'].output.result }}
常见误区: 模板中的 parameters 字段支持 JSON Schema 校验,但不要将敏感信息(如密码、)作为模板参数传递。敏感数据应通过 Backstage 的 Secrets 管理或环境变量注入。
Scaffolder 模板执行流程 用户填写参数 解析 template.yaml 按顺序执行 steps 返回 output 结果 模板输入 projectName language version 模板输出 新项目目录 catalog-info.yaml 实体引用链接

3.4 插件类型与模板的协作关系

在实际开发中,插件类型和 Scaffolder 模板并非孤立概念。前端插件可以调用 Scaffolder 后端 API 来触发模板执行,后端插件可以注册自定义 action 来扩展模板能力,独立插件则可以作为模板步骤中的外部服务调用目标。

  • 前端插件 → Scaffolder:通过 scaffolderApi 调用模板列表和创建任务。
  • 后端插件 → Scaffolder:注册自定义 action,如 publish:github、debug:log。
  • 独立插件 → Scaffolder:作为模板步骤中的 HTTP 回调或事件监听器。