Introduzione ad Apollo Client: Guida Completa per l'Utilizzo di GraphQL nel Frontend
Apollo Client è una libreria potente e flessibile che consente di integrare facilmente GraphQL nelle applicazioni frontend. Con Apollo Client, puoi eseguire query e mutazioni, gestire lo stato globale dell’applicazione e interagire con un server GraphQL con un’esperienza fluida e ottimizzata.
In questa guida, esploreremo come configurare e utilizzare Apollo Client nelle tue applicazioni frontend, come eseguire query e mutazioni, e come sfruttare appieno le funzionalità avanzate di Apollo Client.
Cos’è Apollo Client?
Apollo Client è una libreria che consente di utilizzare GraphQL nel frontend delle applicazioni, gestendo le richieste al server, la cache, e lo stato dell’applicazione. È compatibile con diverse librerie di frontend, come React, Angular e Vue.js, ma è più comunemente utilizzato con React.
Caratteristiche Principali di Apollo Client
- Esecuzione di Query e Mutazioni: Invio di richieste GraphQL al server e gestione delle risposte.
- Gestione della Cache: Apollo Client memorizza i dati delle query nella cache, ottimizzando le prestazioni e riducendo le richieste al server.
- Gestione dello Stato Locale: Utilizzo della cache di Apollo per gestire lo stato dell’applicazione, riducendo la necessità di altre librerie di gestione dello stato come Redux.
- Sottoscrizioni: Supporto per aggiornamenti in tempo reale tramite GraphQL subscriptions.
Configurazione di Apollo Client
1. Installare Apollo Client
Per iniziare, devi installare @apollo/client
insieme a GraphQL:
npm install @apollo/client graphql
2. Configurare Apollo Client in un Progetto React
Supponiamo di avere un progetto React. Ecco come configurare Apollo Client:
Configurazione di Base
Crea un file chiamato ApolloProvider.js
per configurare Apollo Client:
import React from "react";
import {
ApolloClient,
InMemoryCache,
ApolloProvider as Provider,
} from "@apollo/client";
const client = new ApolloClient({
uri: "https://your-graphql-endpoint.com/graphql",
cache: new InMemoryCache(),
});
const ApolloProvider = ({ children }) => {
return <Provider client={client}>{children}</Provider>;
};
export default ApolloProvider;
Poi, usa ApolloProvider
per avvolgere la tua applicazione nel file principale (index.js
o App.js
):
import React from "react";
import ReactDOM from "react-dom";
import App from "./App";
import ApolloProvider from "./ApolloProvider";
ReactDOM.render(
<ApolloProvider>
<App />
</ApolloProvider>,
document.getElementById("root")
);
Esecuzione di Query con Apollo Client
1. Scrivere una Query GraphQL
Crea una query GraphQL per ottenere dati. Supponiamo di voler ottenere un elenco di post con titolo e autore.
import { gql } from '@apollo/client';
export const GET_POSTS = gql`
query GetPosts {
posts {
id
title
author {
name
}
}
}
`;
2. Utilizzare useQuery
per Eseguire la Query
Nel componente React, utilizza l’hook useQuery
per eseguire la query e gestire i risultati.
import React from "react";
import { useQuery } from "@apollo/client";
import { GET_POSTS } from "./queries";
const Posts = () => {
const { loading, error, data } = useQuery(GET_POSTS);
if (loading) return <p>Caricamento in corso...</p>;
if (error) return <p>Errore: {error.message}</p>;
return (
<div>
<h2>Elenco dei Post</h2>
<ul>
{data.posts.map((post) => (
<li key={post.id}>
<h3>{post.title}</h3>
<p>Autore: {post.author.name}</p>
</li>
))}
</ul>
</div>
);
};
export default Posts;
Quando il componente Posts
viene montato, la query viene eseguita, e i dati vengono visualizzati una volta che la risposta è ricevuta.
Esecuzione di Mutazioni con Apollo Client
Le mutazioni sono utilizzate per modificare i dati sul server, come creare, aggiornare o eliminare record.
1. Scrivere una Mutazione GraphQL
Crea una mutazione GraphQL per aggiungere un nuovo post:
import { gql } from '@apollo/client';
export const ADD_POST = gql`
mutation AddPost($title: String!, $author: String!) {
addPost(title: $title, author: $author) {
id
title
author {
name
}
}
}
`;
2. Utilizzare useMutation
per Eseguire la Mutazione
Nel componente React, utilizza l’hook useMutation
per eseguire la mutazione:
import React, { useState } from "react";
import { useMutation } from "@apollo/client";
import { ADD_POST, GET_POSTS } from "./queries";
const AddPost = () => {
const [title, setTitle] = useState("");
const [author, setAuthor] = useState("");
const [addPost, { data, loading, error }] = useMutation(ADD_POST, {
refetchQueries: [{ query: GET_POSTS }],
});
const handleSubmit = (e) => {
e.preventDefault();
addPost({ variables: { title, author } });
setTitle("");
setAuthor("");
};
if (loading) return <p>Caricamento in corso...</p>;
if (error) return <p>Errore: {error.message}</p>;
return (
<div>
<h2>Aggiungi un Nuovo Post</h2>
<form onSubmit={handleSubmit}>
<input
type="text"
value={title}
onChange={(e) => setTitle(e.target.value)}
placeholder="Titolo"
/>
<input
type="text"
value={author}
onChange={(e) => setAuthor(e.target.value)}
placeholder="Autore"
/>
<button type="submit">Aggiungi Post</button>
</form>
</div>
);
};
export default AddPost;
In questo esempio, useMutation
viene utilizzato per eseguire la mutazione ADD_POST
, e refetchQueries
viene utilizzato per aggiornare l’elenco dei post dopo che un nuovo post è stato aggiunto.
Gestione della Cache con Apollo Client
Apollo Client gestisce automaticamente la cache dei dati ricevuti dalle query GraphQL, il che riduce il numero di richieste al server e migliora le prestazioni dell’applicazione.
Accesso Diretto alla Cache
Puoi accedere direttamente alla cache per leggere o scrivere dati senza dover eseguire una query al server:
const { cache } = useApolloClient();
const posts = cache.readQuery({ query: GET_POSTS });
console.log(posts);
Aggiornamento Manuale della Cache
Quando esegui una mutazione, puoi aggiornare manualmente la cache per riflettere i cambiamenti senza dover rifare una query completa:
const [addPost] = useMutation(ADD_POST, {
update(cache, { data: { addPost } }) {
const { posts } = cache.readQuery({ query: GET_POSTS });
cache.writeQuery({
query: GET_POSTS,
data: { posts: posts.concat([addPost]) },
});
},
});
Sottoscrizioni in Tempo Reale
Apollo Client supporta le subscriptions per aggiornamenti in tempo reale:
Configurare Sottoscrizioni
Per utilizzare le subscriptions, è necessario configurare un client WebSocket:
import { split, HttpLink } from "@apollo/client";
import { WebSocketLink } from "@apollo/client/link/ws";
import { getMainDefinition } from "@apollo/client/utilities";
const httpLink = new HttpLink({
uri: "https://your-graphql-endpoint.com/graphql",
});
const wsLink = new WebSocketLink({
uri: "ws://your-graphql-endpoint.com/graphql",
options: {
reconnect: true,
},
});
const splitLink = split(
({ query }) => {
const definition = getMainDefinition(query);
return (
definition.kind === "OperationDefinition" &&
definition.operation === "subscription"
);
},
wsLink,
httpLink
);
const client = new ApolloClient({
link: splitLink,
cache: new InMemoryCache(),
});
Utilizzare useSubscription
import { useSubscription, gql } from '@apollo/client
';
const POST_ADDED = gql`
subscription {
postAdded {
id
title
author {
name
}
}
}
`;
const PostList = () => {
const { data, loading } = useSubscription(POST_ADDED);
if (loading) return <p>Caricamento in corso...</p>;
return (
<div>
<h2>Nuovo Post Aggiunto:</h2>
<p>{data.postAdded.title} di {data.postAdded.author.name}</p>
</div>
);
};
In questo esempio, useSubscription
ascolta il server per nuovi post aggiunti e aggiorna il frontend in tempo reale.
Best Practices per l’Uso di Apollo Client
-
Organizza le Query e le Mutazioni: Mantieni le query, le mutazioni e le subscriptions organizzate in file separati per una migliore manutenibilità.
-
Gestione Efficiente della Cache: Sfrutta la cache di Apollo per ridurre il numero di richieste al server e migliorare le performance.
-
Sfrutta le Sottoscrizioni: Usa le subscriptions per aggiornamenti in tempo reale dove necessario, come per chat, notifiche o dati live.
-
Gestisci gli Errori: Implementa una gestione degli errori robusta per gestire le varie situazioni che possono verificarsi durante le richieste al server GraphQL.
-
Lazy Query: Utilizza query lazy (
useLazyQuery
) per eseguire query on-demand invece che al montaggio del componente.
Conclusione
Apollo Client è uno strumento potente per integrare GraphQL nel frontend delle applicazioni. Con la sua gestione della cache, le subscriptions in tempo reale e la facilità d’uso con React, Apollo Client ti permette di creare applicazioni più interattive e reattive. Seguendo le best practices e le tecniche mostrate in questa guida, sarai in grado di sfruttare al meglio Apollo Client per creare applicazioni frontend moderne e performanti.