4. 项目结构解析:packages/app、packages/backend、plugins 目录作用

Backstage 基线项目采用 monorepo 架构,由三个核心目录构成项目骨架。理解 packages/app、packages/backend 和 plugins 的分工,是进行控制平面接口调用与插件集成的第一步。这三个目录分别对应前端展示层、后端服务层和功能扩展层,形成清晰的关注点分离。

4.1 三层架构总览

下图展示了 Backstage 基线项目的核心目录结构与数据流向。控制平面接口的调用请求从前端发起,经过后端代理,最终由插件处理并返回结果。

Backstage 基线项目核心目录结构 packages/app 前端展示层 App.tsx (入口) 路由与插件挂载 UI 组件与页面 API 客户端调用 packages/backend 后端服务层 index.ts (服务入口) 插件后端路由注册 控制平面接口代理 认证与鉴权中间件 plugins 功能扩展层 catalog (服务目录) scaffolder (模板) techdocs (文档) 自定义业务插件 数据流向:前端发起请求 → 后端代理转发 → 插件处理并返回结果

4.2 packages/app:前端展示层

packages/app 是 Backstage 的前端应用入口,负责 UI 渲染、路由管理和插件前端组件的挂载。在控制平面接口调用场景中,该层负责发起 API 请求并展示返回数据。

文件/目录 作用 与控制平面接口的关系
App.tsx 应用根组件,配置全局路由和插件注册 定义插件页面路由,挂载调用接口的组件
apis.ts API 客户端配置,注册 API 工厂 配置控制平面接口的 baseUrl 和认证
plugins/ 插件前端扩展点,导入插件组件 每个插件可包含独立的接口调用逻辑
package.json 前端依赖声明,包括 @backstage/core 等 引入接口调用所需的 HTTP 客户端库

关键实践:在 apis.ts 中通过 createApiFactory 注册自定义 API 客户端,将控制平面接口的认证信息统一管理,避免在每个组件中重复配置 。

4.3 packages/backend:后端服务层

packages/backend 是 Backstage 的后端服务入口,基于 Express 框架运行。该层是控制平面接口调用的核心代理层,负责转发前端请求、处理认证鉴权、聚合多源数据。

文件/目录 作用 与控制平面接口的关系
index.ts 后端服务启动入口,初始化插件后端 启动 HTTP 服务,加载所有插件后端模块
plugins/ 插件后端路由注册目录 每个插件在此注册其控制平面接口路由
auth/ 认证中间件配置 为控制平面接口调用注入 JWT 或
catalog.ts 服务目录后端处理器 从控制平面拉取实体数据并缓存

架构建议:所有对外部控制平面的接口调用应统一在 packages/backend 层完成,前端不直接访问外部 API。这样做的好处是:集中管理认证凭据、统一错误处理、方便添加请求日志和限流。

4.4 plugins:功能扩展层

plugins 目录是 Backstage 的扩展核心,每个插件通常包含前端组件和后端路由两部分。在控制平面接口调用场景中,插件是接口调用的具体执行单元。

一个标准插件的目录结构如下:

plugins/
├── my-plugin/                    # 自定义插件目录
│   ├── src/
│   │   ├── index.ts              # 插件导出入口
│   │   ├── plugin.ts             # 插件定义,注册路由和组件
│   │   ├── components/           # 前端 UI 组件
│   │   │   ├── MyPluginPage.tsx  # 插件主页面
│   │   │   └── MyPluginTable.tsx # 数据展示表格
│   │   ├── api/                  # API 客户端定义
│   │   │   ├── MyPluginApi.ts    # 接口类型定义
│   │   │   └── MyPluginClient.ts # 接口调用实现
│   │   └── routes.ts             # 前端路由配置
│   ├── backend/                  # 插件后端(可选)
│   │   ├── index.ts              # 后端路由注册
│   │   └── router.ts             # 控制平面接口代理路由
│   ├── package.json
│   └── README.md
└── catalog/                      # 内置插件示例
└── scaffolder/                   # 内置插件示例

4.5 三目录协作流程

以下步骤描述一次完整的控制平面接口调用在三层之间的流转过程:

  1. 前端发起请求:packages/app 中的组件调用插件提供的 API 客户端方法。
  2. 后端接收代理:请求到达 packages/backend 中对应插件的后端路由。
  3. 认证注入:后端中间件从环境变量或配置中读取控制平面凭据,附加到请求头。
  4. 转发至控制平面:后端使用 HTTP 客户端(如 node-fetch)向目标控制平面发送请求。
  5. 响应处理:后端接收响应,进行数据清洗、错误处理,返回给前端。
  6. 前端渲染:packages/app 中的组件接收数据并更新 UI。

常见陷阱:不要在前端组件中直接调用 fetch('https://control-plane.example.com/api/...')。这样做会暴露控制平面地址和认证信息,且无法利用后端的缓存和错误重试机制。所有外部接口调用必须通过 packages/backend 代理。

4.6 目录职责对比

对比维度 packages/app packages/backend plugins
主要职责 UI 渲染与路由 服务代理与认证 业务逻辑扩展
技术栈 React + Material UI Express + Node.js 前后端均可
接口调用方式 调用内部 API 客户端 代理转发至外部 定义接口调用逻辑
认证管理 无直接认证 集中管理凭据 可配置独立认证
扩展方式 注册插件组件 注册插件路由 独立开发部署

4.7 基线集成中的目录配置要点

在将控制平面接口调用集成到 Backstage 基线项目时,需要关注以下配置点:

  • packages/app/package.json:添加插件前端依赖,如 @backstage/plugin-catalog。
  • packages/app/src/App.tsx:使用 FlatRoutes 注册插件页面路由。
  • packages/backend/src/index.ts:调用 createBackend 并添加插件后端模块。
  • packages/backend/src/plugins/:为每个需要调用控制平面接口的插件创建后端路由文件。
  • plugins/your-plugin/src/api/:定义类型安全的 API 客户端,封装接口调用细节。

基线集成检查清单:

  • 确认 packages/backend 中已配置控制平面接口的 baseUrl 和认证凭据。
  • 确认插件后端路由已注册到 packages/backend/src/index.ts。
  • 确认前端 API 客户端通过 createApiRef 和 createApiFactory 注册到 packages/app/src/apis.ts。
  • 确认跨域(CORS)配置允许前端开发服务器访问后端代理。