Open5

Apollo ClientのuseQueryはPersisted Query Hashだけでdata fetchingできるのか?

progfayprogfay

Persisted Query を使うのであれば、 Client Side で DocumentNode を生成するのは bundle size が大きくなったり runtime での処理が増えたりと無駄が多い。
useQuery に Persisted Query Hash を渡すだけで data fetching ができれば上記の無駄を省くことができるが、これが Apollo Client 上で可能なのかを調査する。

progfayprogfay

useQuery 関数に渡った第一引数は verifyDocumentType(query, DocumentType.Query) にて検証されている。
https://github.com/apollographql/apollo-client/blob/1d13de4f190150e96d61a9e987274ee6c249dbef/src/react/hooks/useQuery.ts#L88

verifyDocumentType 関数によって operation.type === DocumentType.Query を満たすかどうかが確認されている。
https://github.com/apollographql/apollo-client/blob/1d13de4f190150e96d61a9e987274ee6c249dbef/src/react/parser/index.ts#L125-L134

progfayprogfay

Dirty Hack ではあるが、以下のような方法でも実現できそう。

const query = gql`
query DummyQuery {
  __typename
}
`
query.__hash = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'

const Component = () => {
  const { data, loading } = useQuery(query)
  return loading ? <p>Loading</p> : <pre>{JSON.stringify(data, undefined, 2)}</pre>
}

そして query.__hash に詰められた Persisted Query Hash を Persisted Query Link 上で詰め替えればそれぞれの Query を bundle に含めることなくリクエストを成功できるはず。
https://blog.studysapuri.jp/entry/gql-codegen-ts-react-apollo-memories

progfayprogfay

とはいえ、理想としては hash を引数に渡すことで useQuery に似たことができる usePersistedQuery のような hooks が Apollo Client に追加されることが好ましい。