Svelte — это современный JavaScript-фреймворк, который позволяет создавать высокопроизводительные приложения с минимальным количеством кода и без необходимости использования виртуального DOM. Важной частью разработки современных приложений является интеграция с серверными API, и одним из популярных решений является использование GraphQL для гибкой и эффективной работы с данными. В этой статье рассмотрим, как интегрировать GraphQL с приложениями на Svelte.
GraphQL — это язык запросов для API, который позволяет клиентам запрашивать только те данные, которые им нужны, и получать ответ в виде точно структурированной информации. В отличие от REST, где часто приходится делать несколько запросов для получения различных данных, в GraphQL можно получить все необходимые данные в одном запросе.
Основные особенности GraphQL:
Для работы с GraphQL в Svelte можно использовать стандартные средства
JavaScript, такие как fetch, либо воспользоваться
специализированными библиотеками, такими как Apollo Client или urql.
Однако, для простоты и гибкости, часто достаточно использовать
fetch с передачей HTTP-запросов к серверу, который
поддерживает GraphQL.
Для начала создадим Svelte компонент, который будет отправлять
запросы к серверу через fetch.
<script>
let data = [];
let loading = true;
let error = null;
const fetchData = async () => {
const query = `
query {
users {
id
name
email
}
}
`;
try {
const response = await fetch('https://your-graphql-endpoint.com/graphql', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({ query }),
});
const result = await response.json();
data = result.data.users;
} catch (err) {
error = 'Ошибка при получении данных';
} finally {
loading = false;
}
};
fetchData();
</script>
{#if loading}
<p>Загрузка...</p>
{:else if error}
<p>{error}</p>
{:else}
<ul>
{#each data as user}
<li>{user.name} - {user.email}</li>
{/each}
</ul>
{/if}
В этом примере происходит отправка запроса с использованием метода
POST и передачи GraphQL-запроса в теле запроса. Результат
обрабатывается в формате JSON. Мы также используем реактивные переменные
data, loading и error, чтобы
контролировать отображение состояния загрузки и ошибок.
Apollo Client — это мощная библиотека для работы с GraphQL, которая упрощает интеграцию, добавляя поддержку кеширования, обработки ошибок, пагинации и других возможностей.
Для использования Apollo в проекте на Svelte нужно установить несколько пакетов:
npm install @apollo/client graphql
Создадим файл для настройки Apollo Client:
import { ApolloClient, InMemoryCache, HttpLink } from '@apollo/client';
const client = new ApolloClient({
link: new HttpLink({
uri: 'https://your-graphql-endpoint.com/graphql',
}),
cache: new InMemoryCache(),
});
export default client;
Теперь можно использовать этот клиент в компонентах Svelte для выполнения запросов.
<script>
import { onMount } from 'svelte';
import { gql } from '@apollo/client';
import client from './apollo-client';
let data = [];
let loading = true;
let error = null;
const GET_USERS = gql`
query {
users {
id
name
email
}
}
`;
onMount(async () => {
try {
const response = await client.query({
query: GET_USERS,
});
data = response.data.users;
} catch (err) {
error = 'Ошибка при получении данных';
} finally {
loading = false;
}
});
</script>
{#if loading}
<p>Загрузка...</p>
{:else if error}
<p>{error}</p>
{:else}
<ul>
{#each data as user}
<li>{user.name} - {user.email}</li>
{/each}
</ul>
{/if}
Здесь используется Apollo Client для выполнения GraphQL-запроса. Мы
использовали метод query, который автоматически обработает
запрос и ответ, а также поддерживает кеширование данных.
Для выполнения мутаций в GraphQL можно использовать метод
mutate из Apollo Client. Мутации полезны, когда необходимо
изменять данные на сервере.
<script>
import { writable } from 'svelte/store';
import { gql } from '@apollo/client';
import client from './apollo-client';
const ADD_USER = gql`
mutation AddUser($name: String!, $email: String!) {
addUser(name: $name, email: $email) {
id
name
email
}
}
`;
let name = '';
let email = '';
let error = null;
let successMessage = '';
const addUser = async () => {
try {
const response = await client.mutate({
mutation: ADD_USER,
variables: { name, email },
});
successMessage = `Пользователь ${response.data.addUser.name} успешно добавлен!`;
} catch (err) {
error = 'Ошибка при добавлении пользователя';
}
};
</script>
<input bind:value={name} placeholder="Имя" />
<input bind:value={email} placeholder="Email" />
<button on:click={addUser}>Добавить пользователя</button>
{#if successMessage}
<p>{successMessage}</p>
{:else if error}
<p>{error}</p>
{/if}
В этом примере создаётся форма для добавления нового пользователя. При отправке формы вызывается мутация, которая передаёт данные на сервер для их сохранения. После выполнения мутации выводится сообщение об успехе или ошибке.
Подписки позволяют приложениям получать обновления в реальном времени от сервера. GraphQL поддерживает подписки через WebSocket, что позволяет клиентам автоматически получать новые данные при изменениях на сервере.
<script>
import { onMount } from 'svelte';
import { gql } from '@apollo/client';
import client from './apollo-client';
let newMessage = null;
const NEW_MESSAGE_SUBSCRIPTION = gql`
subscription {
newMessage {
id
content
sender
}
}
`;
onMount(() => {
const observable = client.subscribe({
query: NEW_MESSAGE_SUBSCRIPTION,
});
observable.subscribe({
next(data) {
newMessage = data.data.newMessage;
},
error(err) {
console.error('Ошибка подписки:', err);
},
});
});
</script>
{#if newMessage}
<div>
<strong>{newMessage.sender}:</strong> {newMessage.content}
</div>
{/if}
Этот пример демонстрирует использование подписки для получения новых сообщений. Как только сервер отправляет новые данные, они автоматически отображаются в приложении.
Интеграция с GraphQL в Svelte позволяет создавать высокоэффективные и
динамичные приложения. Использование библиотеки Apollo Client или
простых запросов через fetch позволяет разработчикам легко
взаимодействовать с сервером, обрабатывать данные и эффективно работать
с состоянием. Благодаря поддержке мутаций, подписок и кеширования,
GraphQL помогает упростить и улучшить взаимодействие с API в современных
веб-приложениях.