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!