Semplifica la gestione del rendering con un approccio innovativo
Vasco: Ciao a tutti! Oggi io e Mario vogliamo parlarvi di una delle funzionalità più rivoluzionarie introdotte in React 19: i Server Components. Questa nuova tecnologia cambia il modo in cui le applicazioni React gestiscono il rendering e il trasferimento dei dati.
Mario: Esatto, Vasco. Con i Server Components, possiamo migliorare le performance, ridurre il bundle lato client e rendere l’esperienza utente più fluida ed efficiente.
Vasco: I Server Components sono componenti React che vengono eseguiti interamente sul server. Questo significa che non pesano sul bundle JavaScript del client e possono accedere direttamente alle risorse del server senza necessità di chiamate API aggiuntive.
Mario: Esatto. A differenza dei Client Components, che vengono eseguiti nel browser e possono gestire interazioni con l’utente, i Server Components vengono eseguiti sul server e restituiscono solo il markup da inviare al client.
Vasco: In React 19, i Server Components non possono essere usati all'interno di un Client Component, ma un Client Component può essere figlio di un Server Component. Ecco un esempio di come strutturare i componenti:
// components/UserProfile.js (Server Component) import db from "../lib/db"; import UserDetails from "./UserDetails"; export default async function UserProfile({ userId }) { const user = await db.getUser(userId); return ( <div> <h2>{user.name}</h2> <p>{user.email}</p> <UserDetails userId={userId} /> </div> ); } // components/UserDetails.js (Client Component) "use client"; import { useState, useEffect } from "react"; export default function UserDetails({ userId }) { const [details, setDetails] = useState(null); useEffect(() => { fetch(`/api/user/details/${userId}`) .then((res) => res.json()) .then((data) => setDetails(data)); }, [userId]); if (!details) return <p>Loading details...</p>; return <p>Additional Info: {details.info}</p>; }
In questo esempio, UserProfile è un Server Component che recupera i dati lato server, mentre UserDetails è un Client Component che gestisce aggiornamenti dinamici lato client.
Vasco: Vediamo ora alcuni dei principali vantaggi dei Server Components:
Mario: Prima dell’introduzione dei Server Components, il modo più comune per recuperare dati lato server era usare tecniche come il Server-Side Rendering (SSR) o Static Site Generation (SSG) con Next.js.
Vasco: Ecco un esempio di come avremmo fatto con SSR usando Next.js
// pages/user.js import { getUser } from "../lib/db"; export async function getServerSideProps(context) { const user = await getUser(context.params.id); return { props: { user } }; } export default function UserPage({ user }) { return ( <div> <h2>{user.name}</h2> <p>{user.email}</p> </div> ); }
Mario: Oppure, se avessimo usato Static Site Generation (SSG)
// pages/user.js import { getUser } from "../lib/db"; export async function getStaticProps() { const user = await getUser("defaultUserId"); return { props: { user } }; } export default function UserPage({ user }) { return ( <div> <h2>{user.name}</h2> <p>{user.email}</p> </div> ); }
Vasco: In React con Client-Side Rendering (CSR), invece, si usava spesso useEffect per recuperare i dati dopo il rendering iniziale:
import { useEffect, useState } from "react"; export default function UserProfile({ userId }) { const [user, setUser] = useState(null); useEffect(() => { fetch(``/api/user/${userId}``) .then((res) => res.json()) .then((data) => setUser(data)); }, [userId]); if (!user) return <p>Loading...</p>; return ( <div> <h2>{user.name}</h2> <p>{user.email}</p> </div> ); }
Mario: Sebbene questo metodo funzioni, React 19 e i Server Components offrono un approccio più pulito ed efficiente, eliminando la necessità di gestire fetch e stato lato client.
Vasco: In sintesi, i Server Components rappresentano un grande passo avanti per React, migliorando le performance, la gestione del codice e l’esperienza di sviluppo.
Mario: E voi? Avete già sperimentato i Server Components nei vostri progetti? Scriveteci, siamo curiosi di conoscere le vostre esperienze!