Next.js Les métadonnées ne sont pas mises à jour ? Voici pourquoi
Vous ne savez pas s'il s'agit de votre code ou d'un cache ?
Vérifiez-le gratuitement avec Proovd. Il montre exactement quelles métadonnées votre URL en direct diffuse actuellement, indépendamment du cache de toute plate-forme.
Réponse rapide
- La plupart des cas sont le propre cache de données de Next.js ou un cache CDN servant du HTML obsolète, et non un bug de code
- generateMetadata dans un composant serveur ne s'exécute à nouveau que lorsque son cache de récupération sous-jacent est revalidé
- Le reste est généralement le cache de la plateforme (Facebook, LinkedIn, etc.), et non Next.js. Vérifiez les deux avant de supposer l'un ou l'autre
Exemple reproductible
Cela semble correct, mais continuera à diffuser des métadonnées obsolètes après une modification du contenu :
export async function generateMetadata({ params }) {
const post = await fetch(`https://api.example.com/posts/${params.slug}`).then(r => r.json());
return {
title: post.title,
openGraph: {
images: [post.image],
},
};
}
L'appel fetch ici est mis en cache par le cache de données de Next.js par défaut. Si post.title ou post.image change dans votre CMS, cette fonction ne verra pas la nouvelle valeur jusqu'à ce que le cache soit revalidé. Sans stratégie explicite, cela peut signifier pas avant la prochaine version complète.
Pourquoi vos métadonnées ne sont pas mises à jour
La récupération sous-jacente est mise en cache
Par défaut, fetch() à l'intérieur de generateMetadata est mis en cache indéfiniment dans l'App Router. Corrigez en définissant une fenêtre de revalidation explicite :
const post = await fetch(url, { next: { revalidate: 60 } }).then(r => r.json());
Ou désactivez complètement la mise en cache pour cette requête :
const post = await fetch(url, { cache: "no-store" }).then(r => r.json());
L'itinéraire est généré statiquement
Si la route utilise generateStaticParams sans qu'aucune revalidation ne soit configurée, la route entière, métadonnées incluses, est intégrée au moment de la construction. L'ajout de export const revalidate = 3600; au niveau de la page force une régénération périodique.
Un cache CDN ou Edge sert l'ancien HTML
Même si votre build est correcte, le réseau Edge de Vercel, Cloudflare ou un autre CDN devant votre application peut servir une réponse HTML en cache antérieure à votre correctif. Vérifiez les en-têtes de réponse :
curl -I https://yoursite.com/blog/post-slug
Recherchez x-vercel-cache: HIT ou un en-tête CDN similaire. Un HIT signifie que vous consultez une copie en cache, pas votre dernier déploiement.
opengraph-image.ts ne récupère pas de nouvelles données
Si vous utilisez la convention basée sur les fichiers opengraph-image.ts, Next.js génère par défaut une image statique au moment de la construction. Le contenu dynamique qu'il contient est soumis aux mêmes règles de mise en cache que tout autre composant serveur, ajoutez donc une revalidation explicite s'il doit rester à jour.
C'est en fait le cache de la plateforme, pas le vôtre
La fausse alerte la plus courante. Votre application peut fournir des métadonnées parfaitement récentes tandis que Facebook, LinkedIn ou Slack affichent toujours un aperçu qu'ils ont mis en cache il y a quelques jours. Confirmez ce que votre serveur envoie avant de toucher un code Next.js. Consultez notre guide pour vider le cache OG sur chaque plateforme.
Guide de réparation étape par étape
- Exécutez
curl -s https://yoursite.com/page | grep -i "og:"pour voir ce que votre serveur envoie réellement - Recherchez un en-tête CDN cache
HITaveccurl -I https://yoursite.com/page - Ajoutez
revalidateoucache explicite : "no-store"pour récupérer à l'intérieur degenerateMetadata - Forcer un nouveau déploiement pour exclure un cache de build obsolète
- Vérifiez le résultat en direct avec Proovd
Next.js par rapport aux autres frameworks
| Framework | Common cause | Fix pattern |
|---|---|---|
| Next.js (App Router) | Cached fetch inside generateMetadata, or static build with no ISR | revalidate option or cache: "no-store" |
| Astro | Client-only meta tag injection instead of static frontmatter/SSR | Move tags into the page's static output |
| SvelteKit | Meta tags set only client-side, not in the server load function | Load meta values server-side, pass to the head |
Liste de contrôle des solutions rapides
- La sortie HTML brute confirmée contient les balises correctes (pas seulement le DOM du navigateur)
- Ajout d'une revalidation ou d'un cache explicite : "no-store" pour récupérer à l'intérieur de generateMetadata
- Vérification des en-têtes de cache CDN/Edge pour un HIT obsolète
- Confirmé si l'itinéraire est entièrement statique sans ISR
- A exclu le propre cache de la plateforme sociale comme véritable cause
- Vérifié la sortie finale en direct avec Proovd
Foire aux questions
Pourquoi mon og:image est-il mis à jour dans le navigateur mais pas sur Facebook ou LinkedIn ?
Votre application Next.js diffuse probablement déjà la bonne balise. La plate-forme affiche une copie mise en cache avant votre correctif. Utilisez le propre outil d'actualisation du cache de cette plate-forme plutôt que de modifier davantage de code.
Est-ce que revalidate: 0 désactive complètement la mise en cache ?
Le paramètre revalidate : 0 force efficacement le rendu dynamique pour cette récupération à chaque requête, similaire à cache : "no-store". Utilisez-le avec parcimonie car il supprime les avantages en termes de performances de la mise en cache.
Articles connexes
Confirmez ce que votre application Next.js sert réellement
Vérifiez gratuitement vos métadonnées en direct avec Proovd. Il montre exactement ce qui se trouve actuellement dans votre code HTML, indépendamment du cache de toute plate-forme.