フリーランス 技術調査ブログ

フリーランス/エンジニア Ruby Python Nodejs Vuejs React Dockerなどの調査技術調査の備忘録

GraphQLのフラグメントについて

はじめに

フラグメント

  • フラグメントは基本的に、再利用可能なクエリの一部です。
  • 各クエリのフィールドが複数回繰り返されているため、まだ改善の余地があります。それらは同じ選択セットであるため、フィールドを一度だけ定義して、必要に応じて参照することができます。そのためにフラグメントを使用できます。

フラグメントを利用する前

query getUsers {
    admins: users(role: ADMIN) {
        id
        firstName
        lastName
        phone
        username
    }
    accountants: users(role: ACCOUNTANT) {
        id
        firstName
        lastName
        phone
        username
    }
}

フラグメント使用後

  • 結果は同じですが、リファクタリングとコードの再利用の観点から、この方法でクエリを記述することには多くの利点があります。
query getUsers {
    admins: users(role: admin) {
        ...userFields
    }
    staffs: users(role: accountant) {
        ...userFields
    }
}
fragment userFields on User {
    id
    firstName
    lastName
    mailAddress
}

インラインフラグメント

  • インラインフラグメントは、実行時に型を解決する必要があるクエリに役立ちます。また、GraphQLの抽象型(UnionまたはInterface)の 1つを実装する必要がある場合は、インラインフラグメントを使用します。インターフェイスのモジュールで説明したように、インターフェイスの最も一般的な例はノードインターフェイスです。Unionは通常、GraphQLでの検索の実装に使用されます。これらのタイプを照会するときは、インラインフラグメントを使用して条件付きで実行する必要があります。この検索クエリは、このインラインフラグメントがどのように見えるかを示しています。

  • githubを利用したquery

query searchwithTypeName {
  search(query: "PHP", type: USER, first: 3) {
    nodes {
      __typename
      ... on User {
        id
        name
        url
      }
      ... on Organization {
        id
        name
        projectsUrl
      }
    }
  }
}
  • 下記のクエリの場合、ユーザーおよび会社に関するステートメントは、タイプ条件です。タイプ条件を使用すると、ユーザーと会社の両方のタイプのフィールドが異なっていても、スキーマ内の異なるタイプに各フラグメントを適用できます。
query searchQuery {
    search(query: "Atheros") {
        ... on User {
        email
        firstName
        lastName
    }
    ... on Company {
        name
        vatId
        }
    }
}

まとめ

RelayやApolloなどのフロントエンドキャッシングクライアントでも頻繁に使用される。 リレーには、いわゆるフラグメントコンテナーがあり、コンポーネントコンポーネントのデータ要件を定義する。 アポロクライアントでは、クエリコロケーションにフラグメントの概念を使用する。 これらのキャッシングクライアントのフラグメントは、UIコンポーネントのデータニーズに基本的に完全に一致している。 これは、FlowまたはTypeScriptを使用した静的型付けに有利に使用できる