Apollo ClientGraphQLGraphQL Code GeneratorNexusPrismaReact NativeTypeScript yarn run compileyarn run watch

TypeScript with Apollo Client〜GraphQL コード ジェネレーター〜

apollo-server-nexus-02 Apollo Client
スポンサーリンク

アプリケーションが成長すると、 Typed システムはバグを早期に発見し、全体的な開発エクスペリエンスを向上させるために不可欠なツールになる可能性があります。

GraphQL は Typed システムを使用して、GraphQL スキーマ内の各型とフィールドで利用可能なデータを明確に定義します。 GraphQL サーバーのスキーマは厳密に型指定されているため、GraphQL コード ジェネレーターなどのツールを使用して TypeScript 定義を自動的に生成できます。 生成された型を使用して、GraphQL 操作の入力と結果の型安全性を確保します。

以下では、フックとコンポーネントのタイプを生成するための GraphQL コード ジェネレーターのインストールと構成について説明します。

プロジェクトを設定する

開発環境の設定を完了して置く必要があります。(関連記事:FrondendBackend )

try🐶everything myproject$ yarn add -D typescript @graphql-codegen/cli @graphql-codegen/client-preset @graphql-typed-document-node/core

GraphQL コード ジェネレーターを定義する

次に、プロジェクトのルートに codegen.ts という名前の GraphQL コード ジェネレーターの構成ファイルを作成します。

// codegen.ts

// codegen.ts

import { CodegenConfig } from '@graphql-codegen/cli';

const config: CodegenConfig = {
  schema: "http://localhost:4000/graphql",
  documents: ['src/**/*.{ts,tsx}'],
  generates: {
    './src/__generated__/': {
      preset: 'client',
      plugins: [],
      presetConfig: {
        gqlTagName: 'gql',
      }
    }
  },
  ignoreNoDocuments: true,
};

export default config;

最後に、次のスクリプトを package.json ファイルに追加します。(Line 6-7)

// package.json

...
  "scripts": {
    ...
    "compile": "graphql-codegen",
    "watch": "graphql-codegen -w"
  },
...

yarn run compile を実行すると、codegen.ts で指定したスキーマ ファイルまたは GraphQL API (バックエンド) に基づいて型が生成されます。

try🐶everything myproject$ yarn run compile
yarn run v1.22.19
$ graphql-codegen
✔ Parse Configuration
✔ Generate outputs
✨  Done in 0.82s.
try🐶everything myproject$ 

// 実行結果

try🐶everything myproject$ tree src/__generated__ 
src/__generated__
├── fragment-masking.ts
├── gql.ts
├── graphql.ts
└── index.ts

0 directories, 4 files
try🐶everything myproject$ 

React フックで使用する

GraphQL コード ジェネレーターは、( src/__generated__/gql.ts ファイルから ) gql 関数を自動的に作成します。 この関数を使用すると、React フックに入る変数と、それらのフックからの結果を入力できます。

useQuery

gql 関数を使用してクエリを定義します。これにより、useQuery フックの型が自動的に生成されます。

// ⭕️ Before
import {gql, useQuery} from '@apollo/client';

export const GET_USERS = gql`
  query UserQuery {
    users {
      name
    }
  }
`;
...

// ⭕️ After
import {useQuery} from '@apollo/client';
import {gql} from 'apollo/__generated__/gql';

export const GET_USERS = gql(`
     query UserQuery {
     users {
       name
     }
   }
  `);
...

GET_USERS にマウスオーバーすると、
const GET_USERS: TypedDocumentNode<UserQueryQuery, Exact<{[key: string]: never;}>>
のようにクエリのタイプが表示されることを確認できたら OK です。

src/__generated__/gql.ts を修正すると誤動作することがあります。

useMutation

useQuery フックを入力するのと同じ方法で useMutation フックを入力できます。 生成された gql 関数を使用して GraphQL ミューテーションを定義すると、ミューテーションの変数を入力してデータが返されるようになります。

まとめ

シンプルに適用でき、すぐ使えます!

yarn run compile をよく使いますが、参考事項として ⬇︎ も残します。

※ 参考:yarn run watch を実行する

yarn run watch を実行するには @parcel/watcher パッケージを追加する必要があります。
GraphQL スキマの変化をリアルタイムでモニタリングし新しいファイルを生成してくれます。

try🐶everything myproject$ yarn add @parcel/watcher
try🐶everything myproject$ yarn run watch          
yarn run v1.22.19
$ graphql-codegen -w
✔ Parse Configuration
✔ Generate outputs
  ℹ Watching for changes in /Users/username/myproject...

参考文献

TypeScript with Apollo Client

スポンサーリンク

コメント

タイトルとURLをコピーしました