最近在团队中落地GraphQL Code Generator 代码生成,において多くの経験を積みました。参考のためにまとめましたので、同様の作業をされる方のお役に立てれば幸いです。
コアコンセプト
まず基本的な実装方法を見てみましょう:
graphql
import { ApolloClient, InMemoryCache, createHttpLink } from '@apollo/client'
import { setContext } from '@apollo/client/link/context'
const httpLink = createHttpLink({ uri: '/graphql' })
const authLink = setContext((_, { headers }) => {
const token = localStorage.getItem('token')
return { headers: { ...headers, authorization: `Bearer ${token}` } }
})
const client = new ApolloClient({
link: authLink.concat(httpLink),
cache: new InMemoryCache({
typePolicies: {
Query: {
fields: {
users: { keyArgs: ['filter'], merge: (e, i) => ({ ...i, edges: [...(e?.edges||[]), ...i.edges] }) }
}
}
}
})
})
このコードは基本的な使い方を示しています。実際のプロジェクトではエラー処理と境界条件も考慮する必要があります。
詳細分析
この基盤の上でさらに最適化できます:
graphql
import { ApolloClient, InMemoryCache, createHttpLink } from '@apollo/client'
import { setContext } from '@apollo/client/link/context'
const httpLink = createHttpLink({ uri: '/graphql' })
const authLink = setContext((_, { headers }) => {
const token = localStorage.getItem('token')
return { headers: { ...headers, authorization: `Bearer ${token}` } }
})
const client = new ApolloClient({
link: authLink.concat(httpLink),
cache: new InMemoryCache({
typePolicies: {
Query: {
fields: {
users: { keyArgs: ['filter'], merge: (e, i) => ({ ...i, edges: [...(e?.edges||[]), ...i.edges] }) }
}
}
}
})
})
このパターンは大規模プロジェクトで非常に実用的で、保守コストを大幅に削減できます。
実装経験
实际项目中的用法会更复杂一些:
graphql
import { ApolloClient, InMemoryCache, createHttpLink } from '@apollo/client'
import { setContext } from '@apollo/client/link/context'
const httpLink = createHttpLink({ uri: '/graphql' })
const authLink = setContext((_, { headers }) => {
const token = localStorage.getItem('token')
return { headers: { ...headers, authorization: `Bearer ${token}` } }
})
const client = new ApolloClient({
link: authLink.concat(httpLink),
cache: new InMemoryCache({
typePolicies: {
Query: {
fields: {
users: { keyArgs: ['filter'], merge: (e, i) => ({ ...i, edges: [...(e?.edges||[]), ...i.edges] }) }
}
}
}
})
})
このアプローチにより、コードのテスト可能性とスケーラビリティが向上します。
最適化戦略
完全な例を以下に示します:
graphql
import { ApolloClient, InMemoryCache, createHttpLink } from '@apollo/client'
import { setContext } from '@apollo/client/link/context'
const httpLink = createHttpLink({ uri: '/graphql' })
const authLink = setContext((_, { headers }) => {
const token = localStorage.getItem('token')
return { headers: { ...headers, authorization: `Bearer ${token}` } }
})
const client = new ApolloClient({
link: authLink.concat(httpLink),
cache: new InMemoryCache({
typePolicies: {
Query: {
fields: {
users: { keyArgs: ['filter'], merge: (e, i) => ({ ...i, edges: [...(e?.edges||[]), ...i.edges] }) }
}
}
}
})
})
境界条件の処理に注意してください。これは本番環境で非常に重要です。
まとめ
- 基礎的な原理を理解することは、APIを暗記することより重要です
- 本番環境で使用する前に必ず互換性を確認してください
- チームコラボレーションでは、規約とドキュメントが技術そのものより重要です