优化 Backstage 插件开发!前端与后端之间的“代码共享”完美策略

在开发 Backstage 插件时,你可能会陷入这样的困境:“前端使用的这个 TypeScript 接口,后端也需要一模一样的,该怎么办?”

在两个包之间重复编写代码不仅违反了 DRY (Don’t Repeat Yourself) 原则,而且当只修改其中一方时,也容易导致运行时错误。现在,我们将揭示 Backstage 维护团队推荐的“通用库包”方法!🛠️


1. 推荐解决方案:分离 common 包 📦

在 Backstage 架构中,如果存在前端 (-frontend) 和后端 (-backend) 都需要引用的代码,那么创建独立的通用包 (Common Package) 是标准做法。

通常使用以下命名约定:

  • 前端: plugins/my-plugin
  • 后端: plugins/my-plugin-backend
  • 通用: plugins/my-plugin-common ✨

2. 为什么要这样做?(优点分析) 💡

  1. 类型安全 (Type Safety): 通过将 API 请求/响应结构定义为接口并共享,可以确保前端和后端之间的数据规范始终一致。
  2. 优化打包大小: 防止后端专用库被包含在前端打包文件中。
  3. 防止循环引用: 保持清晰的依赖结构,避免前端引用后端或反之的情况发生。🛡️

3. 通用包中应包含的内容 📂

通常,以下类型的代码是 common 包的常客:

  • API 实体和接口: 服务器和客户端之间交换的 JSON 数据格式。
  • 权限定义 (Permissions): Backstage 权限系统中使用的权限对象。
  • 常量 (Constants): 插件 ID、特定错误代码、路由路径等。
  • 通用工具函数: 日期计算、字符串处理等不依赖于环境(Node.js vs 浏览器)的纯函数。

4. 实战!分步构建指南 🛠️

第 1 步:创建包

使用 Backstage CLI 创建一个新的通用包,或者模仿现有结构创建 plugins/my-plugin-common 目录。

第 2 步:package.json 配置

此包应具有适当的名称和元数据,以便可以在任何地方导入。

第 3 步:添加依赖 (Dependency)

将我们创建的通用包添加到前端和后端的 package.json 中。

JSON

// plugins/my-plugin/package.json (前端)
"dependencies": {
  "@internal/backstage-plugin-my-plugin-common": "workspace:^"
}

// plugins/my-plugin-backend/package.json (后端)
"dependencies": {
  "@internal/backstage-plugin-my-plugin-common": "workspace:^"
}

5. 注意事项:浏览器与 Node 之间的平衡 ⚖️

编写通用包时最需要注意的是“环境中立性”

  • 禁止: 使用 fs、path 等 Node.js 专用模块(会导致前端报错)
  • 禁止: 使用 window、document 等浏览器专用 API(会导致后端报错)
  • 推荐: 仅使用纯 TypeScript 代码和不依赖于环境的通用库。

🏁 总结

随着 Backstage 插件复杂度的增加,common 包的价值愈发凸显。这种减少代码重复、提高类型安全性的策略,也是大型平台团队稳定运营 Backstage 的关键秘诀。🌟

如果你正在开发插件,何不今天就引入 common 包呢?


标签: Backstage, PluginDevelopment, CodeSharing, TypeScript, Architecture, Frontend, Backend, SoftwareEngineering


Comments

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注