SvelteKit не имеет встроенной поддержки GraphQL, однако существует несколько эффективных библиотек-клиентов для работы с этим протоколом. Наиболее популярные решения включают Apollo Client, urql и graphql-request. Выбор конкретного клиента зависит от сложности проекта, необходимости кэширования, SSR и интеграции с SvelteKit.
В SvelteKit GraphQL-клиент обычно инициализируется в
src/lib или отдельном модуле, чтобы
обеспечить повторное использование и централизованное управление
состоянием запросов.
Apollo Client — мощная библиотека для работы с GraphQL, поддерживающая кэширование, подписки и SSR. Основные шаги интеграции:
npm install @apollo/client graphql
Создается файл src/lib/apolloClient.js:
import { ApolloClient, InMemoryCache, HttpLink } from '@apollo/client';
export const client = new ApolloClient({
link: new HttpLink({
uri: 'https://example.com/graphql', // URL GraphQL сервера
}),
cache: new InMemoryCache(),
});
SvelteKit поддерживает SSR, поэтому Apollo Client можно использовать как в серверных, так и в клиентских компонентах.
<script context="module">
import { client } from '$lib/apolloClient';
import { gql } from '@apollo/client';
export async function load() {
const { data } = await client.query({
query: gql`
query GetUsers {
users {
id
name
email
}
}
`
});
return { props: { users: data.users } };
}
</script>
<script>
export let users;
</script>
<ul>
{#each users as user}
<li>{user.name} — {user.email}</li>
{/each}
</ul>
Ключевой момент: Apollo автоматически управляет кэшированием, поэтому повторные запросы к тем же данным происходят мгновенно.
urql — более легковесная альтернатива Apollo, ориентированная на простые и быстрые проекты. Поддерживает SSR через SvelteKit adapters.
npm install @urql/svelte graphql
Создается src/lib/urqlClient.js:
import { createClient } from '@urql/svelte';
export const client = createClient({
url: 'https://example.com/graphql',
fetchOptions: {
credentials: 'include'
}
});
<script>
import { client } from '$lib/urqlClient';
import { query } from '@urql/svelte';
const GET_USERS = `
query {
users {
id
name
email
}
}
`;
const usersQuery = query(client, GET_USERS);
</script>
{#if $usersQuery.fetching}
<p>Загрузка...</p>
{:else if $usersQuery.error}
<p>Ошибка: {$usersQuery.error.message}</p>
{:else}
<ul>
{#each $usersQuery.data.users as user}
<li>{user.name} — {user.email}</li>
{/each}
</ul>
{/if}
Особенность urql: реактивная подписка на данные
через $usersQuery, что делает обновление UI простым и
предсказуемым.
graphql-request — минималистичный клиент, который идеально подходит для серверных запросов и статических генераций. Он не предоставляет кэширование, поэтому подходит для SSR и SSG сценариев.
npm install graphql-request
import { GraphQLClient, gql } from 'graphql-request';
const client = new GraphQLClient('https://example.com/graphql');
export async function load() {
const query = gql`
query GetPosts {
posts {
id
title
}
}
`;
const data = await client.request(query);
return { props: { posts: data.posts } };
}
Преимущество: простота и высокая скорость, отсутствие лишнего кода и зависимостей.
SvelteKit поддерживает server-side rendering, поэтому важно учитывать, как клиент GraphQL будет работать на сервере. Для этого:
load
функциях, чтобы данные были доступны до рендеринга страницы.load,
так как он не зависит от браузера и не имеет реактивного состояния.Для проектов с реальными обновлениями данных (чат, лента новостей) используется WebSocket-подключение:
subscriptions-transport-ws
или graphql-ws.subscriptionExchange для интеграции
с WebSocket.Пример Apollo Subscription:
import { split, HttpLink, ApolloClient, InMemoryCache } from '@apollo/client';
import { WebSocketLink } from '@apollo/client/link/ws';
import { getMainDefinition } from '@apollo/client/utilities';
const httpLink = new HttpLink({ uri: 'https://example.com/graphql' });
const wsLink = new WebSocketLink({ uri: 'wss://example.com/graphql', options: { reconnect: true } });
const link = split(
({ query }) => {
const definition = getMainDefinition(query);
return definition.kind === 'OperationDefinition' && definition.operation === 'subscription';
},
wsLink,
httpLink
);
export const client = new ApolloClient({
link,
cache: new InMemoryCache()
});
Это позволяет интегрировать подписки в любой SvelteKit компонент с реактивным обновлением UI.
src/lib/graphql/ — хранение запросов и мутаций.src/lib/clients/ — инициализация Apollo, urql или
graphql-request.routes/ — использование load функций для
SSR-запросов.Рекомендация: при большом количестве запросов лучше
вынести GraphQL операции в отдельные .graphql файлы и
импортировать их через graphql-tag.
load или использовать адаптеры типа
adapter-static для SSG.SvelteKit позволяет гибко выбирать подход к интеграции GraphQL: легковесные запросы через graphql-request, реактивные подписки через urql или полноценное кэширование и SSR через Apollo Client. Правильная организация структуры проекта и разделение запросов, мутаций и подписок обеспечивает масштабируемость и поддерживаемость приложений.