đ AmĂ©lioration des performances avec Next.js 13+
Next.js 13+ introduit des fonctionnalités avancées pour optimiser les performances de votre application :
â
Mise en cache automatique des Server Components
â
Streaming des données pour un rendu progressif
â
Optimisation des requĂȘtes cĂŽtĂ© serveur
1ïžâŁ Mise en cache des Server Components
Les Server Components sont par défaut mémorisés et réutilisés pour éviter des rendus inutiles.
đ Exemple : Mise en cache dâune requĂȘte API
async function getProducts() {
const res = await fetch("https://fakestoreapi.com/products", {
next: { revalidate: 3600 }, // Revalide les données toutes les heures
});
return res.json();
}
export default async function ProductsPage() {
const products = await getProducts();
return (
<div>
<h1>Produits</h1>
<ul>
{products.map((product) => (
<li key={product.id}>{product.title}</li>
))}
</ul>
</div>
);
}
â Explication :
fetch()
avec{ next: { revalidate: 3600 } }
met en cache la requĂȘte pendant 1 heure.- Pas de rechargement inutile des donnĂ©es tant quâelles restent valides.
đ Alternatives :
force-cache
pour stocker en cache indéfiniment.no-store
pour désactiver totalement la mise en cache.
2ïžâŁ Streaming des donnĂ©es avec React Suspense
GrĂące au streaming, on peut afficher progressivement les parties dâune page au fur et Ă mesure du chargement.
đ Exemple : Affichage progressif des donnĂ©es
import { Suspense } from "react";
import ProductList from "@/app/products/ProductList";
export default function ProductsPage() {
return (
<div>
<h1>Produits</h1>
<Suspense fallback={<p>Chargement des produits...</p>}>
<ProductList />
</Suspense>
</div>
);
}
async function getProducts() {
await new Promise((resolve) => setTimeout(resolve, 2000)); // Simule un délai réseau
const res = await fetch("https://fakestoreapi.com/products", { cache: "no-store" });
return res.json();
}
export default async function ProductList() {
const products = await getProducts();
return (
<ul>
{products.map((product) => (
<li key={product.id}>{product.title}</li>
))}
</ul>
);
}
â Explication :
- Le titre sâaffiche immĂ©diatement pendant que les produits se chargent.
Suspense
permet de remplacer temporairement le contenu par un message.- AmĂ©liore lâexpĂ©rience utilisateur en affichant progressivement la page.
3ïžâŁ Rendu progressif des Server Components
Next.js permet de charger progressivement les composants dâune page au lieu dâattendre que tout soit prĂȘt.
đ Exemple : Chargement dâune page avec plusieurs composants
import { Suspense } from "react";
import Stats from "@/app/dashboard/Stats";
import RecentActivity from "@/app/dashboard/RecentActivity";
export default function DashboardPage() {
return (
<div>
<h1>Tableau de bord</h1>
<Suspense fallback={<p>Chargement des statistiques...</p>}>
<Stats />
</Suspense>
<Suspense fallback={<p>Chargement des activités récentes...</p>}>
<RecentActivity />
</Suspense>
</div>
);
}
â Explication :
- Chaque composant se charge indépendamment.
Stats
etRecentActivity
sont affichĂ©s dĂšs quâils sont prĂȘts.- Aucun blocage du rendu global.
4ïžâŁ Optimisation des requĂȘtes avec Parallel Fetching
Next.js permet dâexĂ©cuter plusieurs requĂȘtes en parallĂšle pour un rendu plus rapide.
đ Exemple : Chargement parallĂšle de plusieurs API
async function getUser() {
return fetch("https://jsonplaceholder.typicode.com/users/1").then((res) => res.json());
}
async function getPosts() {
return fetch("https://jsonplaceholder.typicode.com/posts?userId=1").then((res) => res.json());
}
export default async function Dashboard() {
const [user, posts] = await Promise.all([getUser(), getPosts()]); // ExĂ©cute les requĂȘtes en parallĂšle
return (
<div>
<h1>Bonjour, {user.name}</h1>
<h2>Vos articles :</h2>
<ul>
{posts.map((post) => (
<li key={post.id}>{post.title}</li>
))}
</ul>
</div>
);
}
â Explication :
Promise.all()
exĂ©cute deux requĂȘtes simultanĂ©ment.- Gagne du temps par rapport Ă des requĂȘtes sĂ©quentielles.
đŻ Conclusion
đ Avec Next.js 13+, on amĂ©liore les performances avec :
â
Mise en cache avancĂ©e pour limiter les requĂȘtes inutiles.
â
Streaming & rendu progressif pour un chargement fluide.
â
ExĂ©cution parallĂšle des requĂȘtes pour un affichage plus rapide.