GraphQL codegen

GraphQL — это мощный инструмент для работы с данными на клиенте и сервере, который обеспечивает гибкость и улучшенную производительность запросов. В контексте Solid.js использование GraphQL позволяет создавать более эффективные и динамичные веб-приложения. Один из способов интеграции GraphQL с Solid.js — это использование библиотеки GraphQL Code Generator. Эта библиотека автоматически генерирует типы и хуки для работы с запросами GraphQL, обеспечивая безопасность типов и удобство разработки.

Что такое GraphQL Codegen?

GraphQL Code Generator — это инструмент, который генерирует код на основе схемы GraphQL и запросов. Он анализирует схему GraphQL и ваши запросы, а затем генерирует TypeScript типы, хуки, функции для взаимодействия с сервером и другие полезные элементы. Использование этого инструмента помогает избежать ошибок, связанных с типами, и улучшает процесс разработки за счет автоматической генерации кода.

В экосистеме Solid.js GraphQL Codegen применяется для упрощения работы с GraphQL-запросами, генерации хуков и типов, а также для обеспечения типовой безопасности в коде.

Установка и настройка

Для начала необходимо установить несколько зависимостей, включая сам GraphQL Codegen и плагины для генерации типов и хуков для работы с GraphQL. Наиболее часто используются следующие пакеты:

npm install @graphql-codegen/cli @graphql-codegen/typescript @graphql-codegen/typescript-operations @graphql-codegen/typescript-react-query
  1. @graphql-codegen/cli — основной пакет для работы с инструментом.
  2. @graphql-codegen/typescript — генерирует типы TypeScript для схемы GraphQL.
  3. @graphql-codegen/typescript-operations — генерирует типы для GraphQL-запросов и мутаций.
  4. @graphql-codegen/typescript-react-query — плагин для интеграции с библиотекой React Query, что важно для использования GraphQL с Solid.js.

После установки зависимостей нужно создать конфигурационный файл для Codegen, чтобы настроить генерацию кода.

Конфигурация GraphQL Codegen

Файл конфигурации для GraphQL Codegen обычно называется codegen.yml. Он должен содержать информацию о вашей схеме GraphQL, типах запросов и плагинах, которые будут использоваться.

Пример конфигурации:

schema: http://localhost:4000/graphql
documents: src/**/*.graphql
generates:
  src/generated/graphql.ts:
    plugins:
      - typescript
      - typescript-operations
      - typescript-react-query
  • schema — адрес вашего GraphQL-сервера, который предоставляет схему.
  • documents — путь к файлам с GraphQL-запросами, которые будут использоваться для генерации типов.
  • generates — путь к файлу, в который будет генерироваться код. В данном случае это src/generated/graphql.ts.

Генерация типов и хуков

После того как конфигурация установлена, можно запустить генерацию кода. Для этого используется команда:

npx graphql-codegen

Эта команда прочитает вашу схему и запросы, сгенерирует типы для операций GraphQL и сохранит их в файл graphql.ts. Теперь можно использовать эти типы в вашем коде, что значительно улучшает типовую безопасность и упрощает процесс разработки.

Пример сгенерированных типов:

export type GetUserQuery = {
  __typename: "Query";
  user: {
    __typename: "User";
    id: string;
    name: string;
    email: string;
  };
};

Также будут сгенерированы хук-обертки для запросов. Например, для запроса получения пользователя можно будет использовать React Query или аналогичный механизм:

import { useQuery } from 'react-query';
import { GetUserQuery } from './generated/graphql';

const useGetUser = (id: string) => {
  return useQuery<GetUserQuery>(['getUser', id], async () => {
    const response = await fetch(`/api/user/${id}`);
    return response.json();
  });
};

Интеграция с Solid.js

Solid.js использует реактивную модель, которая тесно связана с хуками. Для того чтобы интегрировать GraphQL Codegen с Solid.js, можно использовать хуки, генерируемые с помощью typescript-react-query. Это позволяет работать с GraphQL-запросами, используя мощность реактивности Solid.js.

Пример использования с Solid.js:

import { createQuery } from '@tanstack/solid-query';
import { GetUserQuery } from './generated/graphql';

const useGetUser = (id: string) => {
  return createQuery([`getUser-${id}`], async () => {
    const response = await fetch(`/api/user/${id}`);
    return response.json();
  });
};

const UserProfile = (props: { id: string }) => {
  const query = useGetUser(props.id);

  if (query.isLoading) return <div>Loading...</div>;
  if (query.isError) return <div>Error fetching data</div>;

  return (
    <div>
      <h1>{query.data?.user.name}</h1>
      <p>{query.data?.user.email}</p>
    </div>
  );
};

Здесь используется хук createQuery из библиотеки solid-query для выполнения GraphQL-запроса и получения данных с сервера. Компонент UserProfile отображает информацию о пользователе, когда данные загружены.

Преимущества использования GraphQL Codegen с Solid.js

  1. Типовая безопасность — автоматически сгенерированные типы для запросов и мутаций GraphQL предотвращают ошибки, связанные с несовпадением типов.
  2. Упрощение разработки — генерация кода для хуков и операций ускоряет процесс разработки и уменьшает количество ошибок.
  3. Поддержка реактивности — использование хуков в Solid.js обеспечивает работу с данными на основе реактивной модели, что значительно упрощает взаимодействие с состоянием приложения.

Оптимизация запросов с использованием GraphQL Codegen

Одним из важнейших аспектов работы с GraphQL является оптимизация запросов. GraphQL Codegen позволяет эффективно работать с фрагментами и пулингом запросов. Можно использовать фрагменты для повторного использования частей запросов, что помогает избежать дублирования кода.

Пример фрагмента запроса:

fragment userFields on User {
  id
  name
  email
}

query GetUser($id: ID!) {
  user(id: $id) {
    ...userFields
  }
}

Генерация типов с фрагментами позволяет легко и безопасно использовать их в различных частях приложения.

Заключение

Использование GraphQL Codegen в сочетании с Solid.js позволяет существенно улучшить процесс разработки, автоматизировать создание типов и хуков, а также повысить типовую безопасность. Это решение подходит как для небольших проектов, так и для крупных приложений, где важна точность и согласованность работы с данными через GraphQL.