apollo-federation について
apollo-federationは、Apollo Federation 2のGraphQLスキーマ作成を支援するリファレンススキルです。サブグラフをsupergraphに構成する開発者向けに、ディレクティブとパターンを解説します。
主な機能
- 01@linkによるFederation 2の設定
- 02主要ディレクティブの構文と用途
- 03エンティティとサブグラフのパターン
- 04@requiresを使った計算フィールド
- 05ローカル構成と本番チェック
活用シーン
- 01複数サブグラフにまたがるエンティティ定義
- 02外部フィールドに依存するフィールドの追加
- 03サブグラフ間での値型の共有
- 04supergraph構成の検証
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ apollographql/ skills --skill apollo-federationインストール後、Claude Code で/apollo-federationを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/composition.mddirectives.mdschema-patterns.md詳細
Apollo Federation スキーマの作成
Apollo Federation を使用すると、複数の GraphQL API(サブグラフ)を統合されたスーパーグラフに合成できます。
Federation 2 のスキーマ設定
すべての Federation 2 サブグラフは、@link を使用してオプトインする必要があります。
extend schema
@link(url: "https://specs.apollo.dev/federation/v2.12",
import: ["@key", "@shareable", "@external", "@requires", "@provides"])
サブグラフで使用するディレクティブのみをインポートしてください。表示されているバージョン(v2.12)は例示用です。コピーしてそのまま使う前に、現在サポートされているバージョンを Federation の変更履歴で確認してください。
サブグラフの
@linkバージョンは下限であり、合成に使われるバージョンではありません。詳しくは Federation のバージョンを参照してください。
コアディレクティブのクイックリファレンス
| ディレクティブ | 用途 | 例 |
|---|---|---|
@key | 一意のキーを持つエンティティを定義する | type Product @key(fields: "id") |
@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 スキーマから非表示にする | internalId: ID! @inaccessible |
@interfaceObject | エンティティインターフェースにフィールドを追加する | type Media @interfaceObject |
リファレンスファイル
トピックごとの詳細なドキュメントです。
主なパターン
エンティティの定義
type Product @key(fields: "id") {
id: ID!
name: String!
price: Int
}
サブグラフ間でのエンティティへの寄与
# Products subgraph
type Product @key(fields: "id") {
id: ID!
name: String!
price: Int
}
# Reviews subgraph
type Product @key(fields: "id") {
id: ID!
reviews: [Review!]!
averageRating: Float
}
@requires を使った計算フィールド
type Product @key(fields: "id") {
id: ID!
size: Int @external
weight: Int @external
shippingEstimate: String @requires(fields: "size weight")
}
@shareable を使った値型
type Money @shareable {
amount: Int!
currency: String!
}
エンティティのスタブ(寄与せずに参照)
type Product @key(fields: "id", resolvable: false) {
id: ID!
}
基本ルール
- 必ず
@linkディレクティブを使用した Federation 2.x 構文を使ってください - 必ずサブグラフで使用するディレクティブのみをインポートしてください
- そのフィールドに対してすべてのサブグラフが同一の値を返すことを確認せずに、
@shareableを使用しないでください - 単純なエンティティ識別には、単一の ID フィールドを持つ
@keyを優先してください - ローカルで合成を検証するには、
rover supergraph composeを使用してください - 本番スーパーグラフに対して検証するには、
rover subgraph checkを使用してください
コメント
Markdown 対応