slogan3

Gids voor het bouwen van een Svelte-app met GraphQL-integratie

description

Door deze prompt te volgen, leren gebruikers hoe ze efficiënt gegevens kunnen ophalen en beheren in hun Svelte-toepassingen met GraphQL, wat de prestaties en schaalbaarheid van hun app verbetert.

prompt

try_prompt

Help me een Svelte-toepassing op te zetten die GraphQL gebruikt voor gegevensophaling. Beschrijf de stappen om een GraphQL-client op te zetten, queries en mutaties te ... more
generate_helper
disclaimerOnPageApi image_legal_disclaimer...

ai_answers

provider: openai
model: gpt-4.1-nano
Natuurlijk! Hier is een stapsgewijze handleiding om een Svelte-toepassing op te zetten die gebruikmaakt van GraphQL voor gegevensophaling, inclusief realtime updates: 1. Voorbereiding en installatie -------------------------------- Zorg dat je een nieuw Svelte-project hebt, bijvoorbeeld met Vite: ```bash npm create vite@latest mijn-svelte-app -- --template svelte cd mijn-svelte-app npm install ``` 2. GraphQL-client installeren ----------------------------- Gebruik een bibliotheek zoals `@urql/svelte` of `graphql-request`. Voor realtime ondersteuning en eenvoud kies ik `@urql/svelte`: ```bash npm install @urql/svelte ``` 3. Setup van de GraphQL-client ----------------------------- Maak een bestand `src/lib/graphql.js` (of `.ts`) voor de client setup: ```javascript import { createClient } from '@urql/svelte'; export const client = createClient({ url: 'https://api.voorbeeld.com/graphql', // Optioneel: headers, caching, etc. }); ``` 4. Provider toevoegen in `src/main.js` -------------------------------------- In je hoofdbestand, bijvoorbeeld `src/main.js`, voeg de provider toe: ```javascript import App from './App.svelte'; import { setClient } from '@urql/svelte'; import { client } from './lib/graphql'; setClient(client); const app = new App({ target: document.body, }); export default app; ``` 5. Queries en Mutaties maken -------------------------- In je Svelte-componenten gebruik je de `query` en `mutation` functies: **Voorbeeld query (`src/Component.svelte`):** ```svelte <script> import { query } from '@urql/svelte'; const GET_DATA = ` query { items { id naam status } } `; const { data, fetching, error } = query({ query: GET_DATA }); </script> {#if $fetching} <p>Laden...</p> {:else if $error} <p>Fout: {$error.message}</p> {:else} <ul> {#each $data.items as item} <li>{item.naam} - {item.status}</li> {/each} </ul> {/if} ``` **Voorbeeld mutatie:** ```svelte <script> import { mutation } from '@urql/svelte'; const UPDATE_STATUS = ` mutation($id: ID!, $status: String!) { updateItem(id: $id, status: $status) { id status } } `; let itemId = '1'; let nieuweStatus = 'voltooid'; const updateStatus = () => { mutation({ query: UPDATE_STATUS, variables: { id: itemId, status: nieuweStatus } }); }; </script> <button on:click={updateStatus}>Status bijwerken</button> ``` 6. Realtime gegevensupdates implementeren ------------------------------------------ Gebruik GraphQL Subscriptions voor realtime updates. `@urql/svelte` ondersteunt dit via WebSocket. - Installeer WebSocket-ondersteuning: ```bash npm install @urql/core subscriptions-transport-ws ``` - Pas de client-configuratie aan: ```javascript import { createClient, defaultExchanges, subscriptionExchange } from '@urql/svelte'; import { SubscriptionClient } from 'subscriptions-transport-ws'; const subscriptionClient = new SubscriptionClient('wss://api.voorbeeld.com/graphql', { reconnect: true, }); export const client = createClient({ url: 'https://api.voorbeeld.com/graphql', exchanges: [ ...defaultExchanges, subscriptionExchange({ forwardSubscription: (operation) => subscriptionClient.request(operation), }), ], }); ``` - Gebruik een subscription in je component: ```svelte <script> import { subscription } from '@urql/svelte'; const NEW_ITEMS_SUBSCRIPTION = ` subscription { newItem { id naam status } } `; const { data, error } = subscription({ query: NEW_ITEMS_SUBSCRIPTION }); </script> {#if $error} <p>Fout bij realtime updates: {$error.message}</p> {:else} {#if $data} <p>Nieuw item: {$data.newItem.naam}</p> {/if} {/if} ``` 7. Samenvatting ---------------- - Installeer en configureer `@urql/svelte` met WebSocket-ondersteuning. - Maak queries, mutaties en subscriptions. - Gebruik de Svelte stores (`$data`, `$error`, `$fetching`) voor statusbeheer. - Implementeer realtime updates via GraphQL subscriptions voor dynamische gegevens. Met deze stappen heb je een Svelte-toepassing die efficiënt gegevens ophaalt, bijwerkt en realtime synchroniseert via GraphQL.
provider: deepseek
model: deepseek-chat
Hier is een stapsgewijze handleiding voor het opzetten van een Svelte-app met GraphQL, inclusief realtime updates: ## 1. Project setup en dependencies ```bash npm create svelte@latest mijn-graphql-app cd mijn-graphql-app npm install # GraphQL dependencies npm install @apollo/client graphql svelte-apollo npm install -D @graphql-typed-document-node/core ``` ## 2. Apollo Client configuratie Maak `src/lib/apollo.js`: ```javascript import { ApolloClient, InMemoryCache, createHttpLink, split } from '@apollo/client'; import { GraphQLWsLink } from '@apollo/client/link/subscriptions'; import { createClient } from 'graphql-ws'; import { getMainDefinition } from '@apollo/client/utilities'; // HTTP link voor queries en mutaties const httpLink = createHttpLink({ uri: 'https://api.voorbeeld.com/graphql', }); // WebSocket link voor subscriptions (realtime) const wsLink = new GraphQLWsLink(createClient({ url: 'wss://api.voorbeeld.com/graphql', // WebSocket URL connectionParams: () => ({ // Eventuele auth headers authorization: localStorage.getItem('token') || '', }), })); // Split link: subscriptions via WS, rest via HTTP const splitLink = split( ({ query }) => { const definition = getMainDefinition(query); return ( definition.kind === 'OperationDefinition' && definition.operation === 'subscription' ); }, wsLink, httpLink ); export const client = new ApolloClient({ link: splitLink, cache: new InMemoryCache(), defaultOptions: { watchQuery: { fetchPolicy: 'cache-and-network', }, }, }); ``` ## 3. Svelte store voor globale state Maak `src/stores/graphql.js`: ```javascript import { writable } from 'svelte/store'; export const loading = writable(false); export const error = writable(null); export const userData = writable([]); ``` ## 4. GraphQL queries en mutaties Maak `src/lib/queries.js`: ```javascript import { gql } from '@apollo/client'; // Query voor gegevens ophalen export const GET_USERS = gql` query GetUsers { users { id name email createdAt } } `; // Mutation voor gegevens wijzigen export const CREATE_USER = gql` mutation CreateUser($name: String!, $email: String!) { createUser(name: $name, email: $email) { id name email } } `; // Subscription voor realtime updates export const USER_SUBSCRIPTION = gql` subscription OnUserCreated { userCreated { id name email createdAt } } `; ``` ## 5. Hoofdcomponent met realtime functionaliteit `src/routes/+page.svelte`: ```svelte <script> import { onMount } from 'svelte'; import { client } from '$lib/apollo'; import { mutation, query, subscribe } from 'svelte-apollo'; import { GET_USERS, CREATE_USER, USER_SUBSCRIPTION } from '$lib/queries'; import { loading, error, userData } from '$stores/graphql'; let name = ''; let email = ''; // Query voor gebruikers ophalen const usersQuery = query(GET_USERS); // Mutation voor gebruiker aanmaken const createUserMutation = mutation(CREATE_USER); // Realtime subscription const userSubscription = subscribe(USER_SUBSCRIPTION); onMount(() => { // Luister naar realtime updates const subscription = userSubscription.subscribe(({ data }) => { if (data?.userCreated) { console.log('Nieuwe gebruiker in realtime:', data.userCreated); // Update de store of voeg toe aan bestaande data $userData.update(users => [...users, data.userCreated]); } }); return () => subscription.unsubscribe(); }); async function handleSubmit() { $loading = true; $error = null; try { const result = await createUserMutation({ variables: { name, email } }); if (result.data) { name = ''; email = ''; console.log('Gebruiker aangemaakt:', result.data.createUser); } } catch (err) { $error = err.message; } finally { $loading = false; } } </script> <svelte:head> <title>GraphQL Svelte App</title> </svelte:head> <main> <h1>GraphQL met Svelte - Realtime Updates</h1> <!-- Formulier voor nieuwe gebruiker --> <form on:submit|preventDefault={handleSubmit}> <input type="text" bind:value={name} placeholder="Naam" required /> <input type="email" bind:value={email} placeholder="E-mail" required /> <button type="submit" disabled={$loading}> {#if $loading}Bezig...{:else}Gebruiker aanmaken{/if} </button> </form> <!-- Foutmelding --> {#if $error} <div class="error">{$error}</div> {/if} <!-- Gebruikerslijst --> <div class="users"> <h2>Gebruikers ({$usersQuery.data?.users?.length || 0})</h2> {#if $usersQuery.loading} <p>Laden...</p> {:else if $usersQuery.error} <p class="error">Fout bij ophalen: {$usersQuery.error.message}</p> {:else if $usersQuery.data?.users} <ul> {#each $usersQuery.data.users as user (user.id)} <li> <strong>{user.name}</strong> - {user.email} <small>{new Date(user.createdAt).toLocaleDateString('nl-NL')}</small> </li> {/each} </ul> {:else} <p>Geen gebruikers gevonden</p> {/if} </div> <!-- Realtime notificatie --> <div class="realtime-indicator"> 🔄 Realtime updates actief </div> </main> <style> .error { color: red; margin: 10px 0; } .users { margin-top: 20px; } .realtime-indicator { position: fixed; top: 10px; right: 10px; background: #4CAF50; color: white; padding: 5px 10px; border-radius: 15px; font-size: 12px; } </style> ``` ## 6. App layout configuratie `src/app.html` (of gebruik SvelteKit's layout systeem): ```html <!DOCTYPE html> <html lang="nl"> <head> <meta charset="utf-8" /> <link rel="icon" href="%sveltekit.assets%/favicon.png" /> <meta name="viewport" content="width=device-width" /> </head> <body data-sveltekit-preload-data="hover"> <div style="display: contents">%sveltekit.body%</div> </body> </html> ``` ## 7. TypeScript ondersteuning (optioneel) Voeg types toe in `src/app.d.ts`: ```typescript declare global { namespace App { interface Locals { user: import('$lib/types').User | null; } } } export {}; ``` ## Belangrijke punten: 1. **Realtime updates**: De subscription luistert naar nieuwe gebruikers en update de UI automatisch 2. **Error handling**: Fouten worden netjes afgehandeld en getoond aan de gebruiker 3. **Loading states**: Duidelijke feedback tijdens het laden 4. **Cache management**: Apollo Client zorgt voor optimale caching 5. **Type safety**: Gebruik TypeScript voor betere developer experience ## Start de applicatie: ```bash npm run dev ``` Deze setup biedt een complete GraphQL-integratie met realtime functionaliteit, error handling en een professionele ontwikkelaarservaring.