Настройка Apollo Client в React
Настройте ApolloProvider, создайте клиент Apollo с кэшем и цепочкой ссылок и подключитесь к API GraphQL
«Настройка Apollo Client в React» — бесплатный урок React Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения React Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс React Academy содержит 4 уроков всего.
Установка Apollo Client
Установите @apollo/client и graphql. Пакет graphql является зависимостью, необходимой Apollo Client для разбора документов запросов с помощью шаблонного тега gql.
В проектах TypeScript оба пакета содержат собственные определения типов, поэтому пакеты @types не нужны.
Создание экземпляра ApolloClient
Создайте экземпляр ApolloClient с кэшем и связующим модулем. Простейшая настройка: new ApolloClient({ cache: new InMemoryCache(), uri: '/graphql' }). Сокращённая запись uri создаёт HttpLink внутри.
Для большего контроля создайте цепочку связующих модулей вручную и передайте её параметру link вместо uri.
ApolloProvider
Оберните приложение React в ApolloProvider и передайте свойство client: ApolloProvider client={client}. Это делает экземпляр Apollo Client доступным всем дочерним компонентам через контекст React.
Каждый вызов useQuery и useMutation в дереве компонентов автоматически использует этот клиент без сквозной передачи свойств.
InMemoryCache: нормализованное кэширование
InMemoryCache — кэш Apollo Client по умолчанию. Он нормализует полученные данные по типу и ID, сохраняя каждую сущность под уникальным ключом кэша (например, User:1). Когда любой запрос получает User:1, все последующие чтения этой сущности возвращают обновлённые данные.
Благодаря нормализации обновление пользователя в одной мутации автоматически обновляет результаты всех запросов, содержащих этого пользователя, без дополнительного кода.
HttpLink
HttpLink отвечает за передачу данных по HTTP от Apollo Client к серверу GraphQL. Настройте его с помощью uri и при необходимости укажите fetch, headers и credentials.
В сложных случаях разделяющие связующие модули направляют разные операции к разным конечным точкам: подписки передаются через WebSocket (WebSocketLink), а запросы и мутации — через HTTP (HttpLink).
AuthLink с setContext
Импортируйте setContext из @apollo/client/link/context. Создайте связующий модуль авторизации: const authLink = setContext((_, { headers }) => ({ headers: { ...headers, authorization: 'Bearer ' + getToken() } })). Объедините его с HttpLink: authLink.concat(httpLink).
Связующий модуль setContext выполняется перед каждым запросом и динамически добавляет заголовки авторизации к каждой операции.
Составление цепочки связующих модулей
Объединяйте связующие модули с помощью ApolloLink.from([authLink, errorLink, httpLink]) или authLink.concat(httpLink). Связующие модули работают как промежуточный слой: каждый обрабатывает операцию и передаёт её в next(). Последний модуль цепочки отправляет фактический HTTP-запрос.
Распространённые цепочки: связующий модуль авторизации (добавляет заголовки) + связующий модуль ошибок (обрабатывает ошибки) + связующий модуль HTTP (отправляет запрос).
Ошибка Apollo Link
Импортируйте onError из @apollo/client/link/error. Связующий модуль ошибок глобально перехватывает ошибки GraphQL и сетевые ошибки. Используйте его для перенаправления на страницу входа при ошибках UNAUTHENTICATED или для отображения глобального всплывающего уведомления о сетевой ошибке.
Связующий модуль ошибок должен находиться перед связующим модулем HTTP в цепочке, но может вызвать forward(operation), чтобы повторить запрос.
Варианты политики получения данных
cache-first (по умолчанию): немедленно вернуть данные из кэша; если они устарели, повторно получить их в фоновом режиме. network-only: всегда получать данные с сервера и обновлять кэш. cache-and-network: немедленно вернуть данные из кэша И выполнить запрос, обновив интерфейс после получения ответа. cache-only: читать только из кэша и выдавать ошибку, если данных в нём нет. no-cache: всегда получать данные и никогда не записывать их в кэш.
Выбирайте вариант с учётом требований к актуальности данных: для панелей мониторинга часто используют cache-and-network, а для форм профиля пользователя — network-only.
Глобальная настройка политики получения данных по умолчанию
Задайте политику fetchPolicy по умолчанию в defaultOptions объекта InMemoryCache: new ApolloClient({ defaultOptions: { watchQuery: { fetchPolicy: 'cache-and-network' } } }). Отдельные вызовы useQuery могут переопределить это значение для конкретного запроса.
Разумное глобальное значение по умолчанию сокращает количество шаблонного кода, необходимого для указания fetchPolicy в каждом вызове хука.
Apollo Client DevTools
Расширение браузера Apollo Client DevTools добавляет панель Apollo в Chrome DevTools. Оно показывает все запросы в кэше и их текущие данные, позволяет изучать нормализованный кэш и повторно запускать запросы из панели DevTools.
Установите расширение из Chrome Web Store и инициализируйте клиент с параметром devtools: { enabled: true } (по умолчанию включённым в режиме разработки).
Составление цепочки Apollo Link
В цепочке связующих модулей Apollo Client где должен находиться errorLink относительно httpLink?
Итоги урока
Установите @apollo/client и graphql, создайте ApolloClient с InMemoryCache и цепочкой связующих модулей, а затем оберните приложение в ApolloProvider. Цепочка связующих модулей объединяет authLink (добавляет токены), errorLink (глобально обрабатывает ошибки) и httpLink (передаёт данные по HTTP). Политика получения данных управляет приоритетом кэша и сети, а InMemoryCache нормализует сущности по типу и идентификатору.
Расширение браузера Apollo DevTools упрощает просмотр кэша и отладку.
Часто задаваемые вопросы
Урок «Настройка Apollo Client в React» бесплатный?
Да — полный текст урока «Настройка Apollo Client в React» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс React Academy, подпишись на CoddyKit PRO. Курс React Academy содержит 4 уроков всего.
Чему я научусь в уроке «Настройка Apollo Client в React»?
Настройте ApolloProvider, создайте клиент Apollo с кэшем и цепочкой ссылок и подключитесь к API GraphQL Ты практикуешь React Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать React Academy?
Предыдущий опыт не требуется. React Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «Настройка Apollo Client в React»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке React Academy?
Да. Каждый урок React Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Основы GraphQL для разработчиков React
- Настройка Apollo Client в React
- Хуки useQuery и useMutation
- Кэш Apollo: нормализация и обновления