其他
用 Apollo Federation 2 编写子图…
在构建或维护 Apollo Federation 2 子图 schema(实体、@key、@shareable、跨子图字段、组合报错)时使用。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 48/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 85/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 53/100 ×0.15
适用场景
用 Apollo Federation 通用
解决思路
- 每个 Federation 2 子图都必须通过 `@link` 显式启用联邦:`extend schema @link(url: "https://specs.apollo.dev/federation/v2.12", import: [...])`。
- 只 import 该子图实际用到的指令,不要全量导入。
- 复制 `@link` 版本号前先查阅 Federation changelog 确认当前受支持的版本;子图的 `@link` 版本是下限而非组合版本。
- 用 `@key` 定义实体唯一键,例如 `type Product @key(fields: "id")`;简单实体优先使用单一 ID 字段作为 `@key`。
- 用 `@shareable` 允许多个子图解析同一字段,例如 `type Position @shareable { x: Int! }`;使用前必须确保所有子图对该字段返回完全相同的值。
- 用 `@external` 引用其他子图中的字段,例如 `weight: Int @external`。
- 用 `@requires` 定义依赖外部字段的计算字段,例如 `shippingCost: Int @requires(fields: "weight")`。
- 用 `@provides` 有条件地解析外部字段,例如 `@provides(fields: "name")`。
- 用 `@override` 把字段迁移到当前子图,例如 `@override(from: "Products")`。
- 用 `@inaccessible` 把字段从 API schema 中隐藏,例如 `internalId: ID! @inaccessible`。
- 用 `@interfaceObject` 给实体接口添加字段,例如 `type Media @interfaceObject`。
- 跨子图贡献实体字段时,各子图分别用相同的 `@key` 声明该实体并只添加自己负责的字段(如 Products 子图提供 name/price,Reviews 子图提供 reviews/averageRating)。
- 定义值类型时使用 `@shareable`,例如 `type Money @shareable { amount: Int! currency: String! }`。
- 需要引用实体但不贡献字段时,使用不可解析的实体桩:`type Product @key(fields: "id", resolvable: false) { id: ID! }`。
- 用 `rover supergraph compose` 在本地验证组合是否成功。
- 用 `rover subgraph check` 针对生产 supergraph 验证子图变更。
适用边界 · 注意事项
- 不要使用 Federation 1 语法,必须使用带 `@link` 的 Federation 2.x 语法。
- 不要 import 子图未使用的指令。
- 不要在无法保证所有子图对该字段返回相同值时使用 `@shareable`。