Le nouveau modèle de cache de Next.js 16
Next.js 16 introduit les Cache Components : un nouveau système de cache explicite et opt-in. Dans les versions précédentes, le cache était activé par défaut et souvent source de confusion. Désormais, tout est dynamique par défaut — vous choisissez explicitement ce que vous voulez mettre en cache avec la directive "use cache".
// fetch() était caché par défaut
// Vous deviez opt-out du cache
const data = await fetch(url, {
cache: 'no-store', // pour ne PAS cacher
next: { revalidate: 60 }, // ou ISR
});// Tout est dynamique par défaut
// Vous opt-in le cache explicitement
'use cache';
const data = await fetch(url);
// Cette fonction EST maintenant cachéeActiver les Cache Components
import type { NextConfig } from 'next';
const nextConfig: NextConfig = {
cacheComponents: true, // Active "use cache"
};
export default nextConfig;
« use cache » sur une fonction
Ajoutez "use cache" à une fonction async pour que son résultat soit mis en cache. Next.js génère automatiquement une clé de cache basée sur les arguments.
import { cacheLife, cacheTag } from 'next/cache';
export async function getPosts() {
'use cache';
cacheLife('hours'); // expire après quelques heures
cacheTag('posts'); // tag pour invalidation ciblée
const res = await fetch('https://api.example.com/posts');
return res.json();
}
export async function getPost(slug: string) {
'use cache';
cacheLife('max'); // cache longue durée
cacheTag(`post-${slug}`); // tag spécifique à l'article
const res = await fetch(`https://api.example.com/posts/${slug}`);
return res.json();
}
'seconds' → cache très court. 'minutes' → quelques minutes. 'hours' → quelques heures. 'days' → quelques jours. 'weeks' → une semaine. 'max' → cache le plus long possible, revalidation en arrière-plan (recommandé pour le contenu stable).
« use cache » sur un composant entier
import { cacheLife, cacheTag } from 'next/cache';
export async function PostList() {
'use cache';
cacheLife('hours');
cacheTag('posts');
const posts = await getPosts();
return (
<ul className="space-y-4">
{posts.map((p: { id: number; title: string }) => (
<li key={p.id} className="p-4 border rounded-xl">{p.title}</li>
))}
</ul>
);
}
// Dans la page, tout le rendu HTML de PostList est caché
Invalider le cache avec revalidateTag()
Quand vous mettez à jour vos données, invalidez le cache par tag. revalidateTag() dans Next.js 16 prend un second argument : le profil de revalidation.
'use server';
import { revalidateTag, updateTag } from 'next/cache';
// Invalide en arrière-plan (stale-while-revalidate)
// L'utilisateur voit les données cachées pendant la revalidation
export async function publishPost(id: string) {
await db.posts.publish(id);
revalidateTag('posts', 'max'); // refresh en arrière-plan
}
// Invalide immédiatement (read-your-writes)
// L'utilisateur voit SES changements instantanément
export async function updatePost(id: string, data: PostData) {
await db.posts.update(id, data);
updateTag(`post-${id}`); // invalidation immédiate
}
revalidateTag(tag, profil) = revalidation en arrière-plan. L’utilisateur voit encore l’ancienne version le temps du refresh (parfait pour le contenu public). updateTag(tag) = invalidation immédiate. L’utilisateur voit ses propres modifications instantanément (parfait pour les formulaires, le profil utilisateur).
Exercice pratique
- Activez
cacheComponents: truedans votrenext.config.ts - Créez une fonction
getUsers()avec"use cache",cacheLife('hours')etcacheTag('users') - Utilisez cette fonction dans un Server Component
app/users/page.tsx - Créez une Server Action qui appelle
revalidateTag('users', 'max')après une mise à jour fictive - Observez dans les logs Next.js que la page est servie depuis le cache lors d’un second appel