← Blog

Next.js Metagegevens worden niet bijgewerkt? Hier is waarom

Je werkt generateMetadata bij, implementeert deze opnieuw en de oude titel of afbeelding wordt nog steeds weergegeven wanneer je de link deelt. Hier ziet u hoe u kunt bepalen of het een cachinglaag of een codefout is.

Weet je niet zeker of het jouw code of een cache is?

Controleer het gratis met Proovd. Het laat precies zien welke metadata uw live URL momenteel weergeeft, onafhankelijk van de eigen cache van welk platform dan ook.

Snel antwoord

  • De meeste gevallen zijn de eigen gegevenscache van Next.js of een CDN-cache die verouderde HTML serveert, en geen codefout
  • generateMetadata in een servercomponent wordt alleen opnieuw uitgevoerd als de onderliggende ophaalcache opnieuw wordt gevalideerd
  • De rest is meestal de cache van het platform (Facebook, LinkedIn, enz.), niet Next.js. Controleer beide voordat u een van beide aanneemt

Reproduceerbaar voorbeeld

Dit ziet er correct uit, maar blijft verouderde metadata weergeven na een inhoudswijziging:

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],
    },
  };
}

De aanroep fetch hier wordt standaard in de cache opgeslagen door de gegevenscache van Next.js. Als post.title of post.image verandert in uw CMS, zal deze functie de nieuwe waarde pas zien als de cache opnieuw wordt gevalideerd. Zonder expliciete strategie kan dat betekenen dat het pas bij de volgende volledige build zal zijn.

Waarom uw metadata niet worden bijgewerkt

De onderliggende ophaalactie wordt in de cache opgeslagen

Standaard wordt fetch() binnen generateMetadata voor onbepaalde tijd in de App Router opgeslagen. Oplossing door een expliciete hervalidatieperiode in te stellen:

const post = await fetch(url, { next: { revalidate: 60 } }).then(r => r.json());

Of u kunt zich volledig afmelden voor caching voor dat verzoek:

const post = await fetch(url, { cache: "no-store" }).then(r => r.json());

De route wordt statisch gegenereerd

Als de route generateStaticParams gebruikt en er geen hervalidatie is geconfigureerd, wordt de volledige route, inclusief metagegevens, tijdens het bouwen ingebakken. Het toevoegen van export const revalidate = 3600; op paginaniveau dwingt periodieke regeneratie af.

Een CDN of edge cache bedient de oude HTML

Zelfs als uw build correct is, kan Vercel's Edge Network, Cloudflare of een andere CDN vóór uw app een in de cache opgeslagen HTML-antwoord weergeven dat ouder is dan uw oplossing. Controleer de antwoordheaders:

curl -I https://yoursite.com/blog/post-slug

Zoek naar x-vercel-cache: HIT of een soortgelijke CDN header. Een HIT betekent dat u naar een in de cache opgeslagen kopie kijkt, en niet naar uw laatste implementatie.

opengraph-image.ts haalt geen nieuwe gegevens op

Als u de op bestanden gebaseerde conventie opengraph-image.ts gebruikt, genereert Next.js standaard een statische afbeelding tijdens het bouwen. Dynamische inhoud daarin is onderworpen aan dezelfde cachingregels als elke andere servercomponent, dus voeg expliciete hervalidatie toe als deze nieuw moet blijven.

Het is eigenlijk de cache van het platform, niet die van jou

Het meest voorkomende valse alarm. Uw app kan perfect nieuwe metadata weergeven terwijl Facebook, LinkedIn of Slack nog steeds een voorbeeld toont dat ze dagen geleden in de cache hebben opgeslagen. Bevestig wat uw server verzendt voordat u een Next.js-code aanraakt. Zie onze gids voor het wissen van de OG-cache op elk platform.

Stap-voor-stap oplossingsgids

  1. Voer curl -s https://yoursite.com/page | uit grep -i "og:" om te zien wat uw server daadwerkelijk verzendt
  2. Controleer op een CDN cache HIT header met curl -I https://yoursite.com/page
  3. Voeg expliciet revalidate of cache: "no-store" toe om binnen generateMetadata op te halen
  4. Forceer een nieuwe implementatie om een ​​verouderde build-cache uit te sluiten
  5. Controleer het live resultaat met Proovd

Next.js versus andere raamwerken

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

Controlelijst voor snelle reparatie

  1. Bevestigde onbewerkte HTML-uitvoer heeft de juiste tags (niet alleen de browser-DOM)
  2. Expliciete hervalidatie of cache toegevoegd: "no-store" om binnen generateMetadata op te halen
  3. CDN/edge cache headers gecontroleerd op een verouderde HIT
  4. Bevestigd of de route volledig statisch is zonder ISR
  5. Sluit de eigen cache van het sociale platform uit als de echte oorzaak
  6. De uiteindelijke live-uitvoer geverifieerd met Proovd

Veelgestelde vragen

Waarom wordt mijn og:image bijgewerkt in de browser, maar niet op Facebook of LinkedIn?

Uw Next.js-app gebruikt waarschijnlijk al de juiste tag. Het platform toont een kopie die vóór uw oplossing in de cache is opgeslagen. Gebruik de eigen cache-vernieuwingstool van dat platform in plaats van nog meer code te wijzigen.

Schakelt revalidate: 0 caching volledig uit?

Het instellen van revalidate: 0 forceert effectief dynamische weergave voor die ophaalactie bij elk verzoek, vergelijkbaar met cache: "no-store". Gebruik het spaarzaam, omdat het de prestatievoordelen van caching wegneemt.

Bevestig wat uw Next.js app daadwerkelijk serveert

Controleer uw live metadata gratis met Proovd. Het laat precies zien wat er momenteel in uw HTML staat, onafhankelijk van de cache van welk platform dan ook.