Apolloメモ

リクエスト

レスポンスに応じたデフォルトの処理をセットする
https://www.apollographql.com/docs/react/networking/advanced-http-networking/#customizing-response-logic

fetch関数を変更する
https://www.apollographql.com/docs/react/networking/advanced-http-networking#custom-fetching

Query

Mutation

キャッシュ

キャッシュのキー

キャッシュを操作する

以下はクエリのみ操作する。つまり、サーバにリクエストが送信されない。 Apollo ClientはInMemoryCacheをプロキシしている。

クエリで操作

client.readQuery / client.writeQuery / client.updateQuery

readQuery

キャッシュに対応する値がない場合はnullを返す。

フラグメントで操作

client.readFragment / client.writeFragment / client.updateFragment / client.useFragment

手動で操作

cache.modify

cache.identify(obj)objのidを取得する。

refのフィールドにアクセスるにはreadField()を使う。

useMutationで使用するとサーバへのアクセスなしにキャッシュを変更することができる。

キャッシュからデータを削除する

cache.evict({ id: 'foo-id' })はidが'foo-id'のデータをキャッシュから削除します。 cache.gc()で孤立したデータを削除する。

すべてのキャッシュをクリアするにはclient.clearStore()を使う。

fetchMore

フラグメント

const FooFragment = gql`
  fragment FooFragment on Bar {
    name
  }
`;

const client = new ApolloClient({
  uri: 'https://example.com/',
  cache: new InMemoryCache({
    fragments: createFragmentRegistry(gql`
      ${UserFragment}
    `),
  }),
});

type

type Car {
  id: ID!
  name: String!
  size(unit: LengthUnit = METER): Float
}

ディレクティブ

GraphQL標準のディレクティブ

https://spec.graphql.org/June2018/#sec-Type-System.Directives

@client

フィールドがローカルに存在するデータであり、そのデータ取得がサーバーへのクエリではなくクライアント側のキャッシュまたはローカルストアから行われることを示すフラグとして機能します。

@connect

@connectionディレクティブを付与すると、同じクエリでも@connectionディレクティブに与えられた値毎に別のクエリとして区別されます。これによって、同じクエリで用途に応じて複数の値をキャッシュすることができます。

@defer

指定したフィールドを遅延的に取得する。

@export

指定したフィールドを変数として使うことができるようにする。

@nonreactive

指定したフィールドが変更されても再レンダリングが発生しないようにする。

ローカルステート

リアクティブ

makeVar関数をread関数かuseReactiveVarフックを使ってリアクティブな処理にします。

値を取得するにはmakeVar関数の戻り値の関数を実行する。

@client

@clientディレクティブをクエリのフィールドに付与するとローカルにのみ有効なフィールドになる。

@clinetディレクティブが付与されたフィールドの値を生成はtypePoliciesread関数で行う。

@client @export(as: "authorId")のようにローカルステートのフィールドをクエリで使うことができます。

クライアント用のクエリを定義する

typeDefsextend typeしたクエリを指定する。

テスト

https://www.apollographql.com/docs/react/development-testing/testing

パフォーマンス

バンドルサイズを小さくする方法 https://www.apollographql.com/docs/react/development-testing/reducing-bundle-size