← Blog

Next.js Metadata opdateres ikke? Her er hvorfor

Du opdaterer generateMetadata, omimplementerer, og den gamle titel eller billede vises stadig, når du deler linket. Her kan du se, om det er et cachelag eller en kodefejl.

Er du i tvivl om det er din kode eller en cache?

Tjek det gratis med Proovd. Det viser præcis, hvilke metadata din live URL serverer lige nu, uafhængigt af enhver platforms egen cache.

Hurtigt svar

  • De fleste tilfælde er Next.jss egen datacache eller en CDN-cache, der serverer gammel HTML, ikke en kodefejl
  • generateMetadata i en serverkomponent kører kun igen, når dens underliggende hente-cache genvalideres
  • Resten er normalt platformens cache (Facebook, LinkedIn osv.), ikke Next.js. Tjek begge, før du antager enten

Reproducerbart eksempel

Dette ser korrekt ud, men vil fortsætte med at vise forældede metadata efter en indholdsændring:

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

fetch-kaldet her cachelagres som standard af Next.jss datacache. Hvis post.title eller post.image ændres i din CMS, vil denne funktion ikke se den nye værdi, før cachen genvalideres. Uden nogen eksplicit strategi kan det betyde, at det ikke er før den næste fulde build.

Hvorfor dine metadata ikke opdateres

Den underliggende hentning er cachelagret

Som standard cachelagres fetch() inde i generateMetadata på ubestemt tid i App-routeren. Ret ved at indstille et eksplicit genvalideringsvindue:

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

Eller fravælg helt cachelagring for denne anmodning:

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

Ruten er statisk genereret

Hvis ruten bruger generateStaticParams uden genvalidering konfigureret, indbygges hele ruten, inklusive metadata, på byggetidspunktet. Tilføjelse af export const revalidate = 3600; på sideniveau fremtvinger periodisk regenerering.

En CDN eller edge cache serverer den gamle HTML

Selvom din build er korrekt, kan Vercel's Edge Network, Cloudflare eller en anden CDN foran din app vise et cachelagret HTML-svar, der går forud for din rettelse. Tjek svaroverskrifter:

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

Se efter x-vercel-cache: HIT eller en lignende CDN header. Et HIT betyder, at du ser på en cachelagret kopi, ikke din seneste implementering.

opengraph-image.ts opfanger ikke nye data

Hvis du bruger den filbaserede opengraph-image.ts-konvention, genererer Next.js som standard et statisk billede på byggetidspunktet. Dynamisk indhold inde i det er underlagt de samme cacheregler som enhver anden serverkomponent, så tilføj eksplicit genvalidering, hvis det skal forblive frisk.

Det er faktisk platformens cache, ikke din

Den mest almindelige falsk alarm. Din app kan levere helt friske metadata, mens Facebook, LinkedIn eller Slack stadig viser en forhåndsvisning, de cachelagde for dage siden. Bekræft, hvad din server sender, før du trykker på en Next.js-kode. Se vores guide til at rydde OG-cache på hver platform.

Trin-for-trin rettelsesvejledning

  1. Kør curl -s https://yoursite.com/page | grep -i "og:" for at se, hvad din server rent faktisk sender
  2. Tjek efter en CDN cache HIT header med curl -I https://yoursite.com/page
  3. Tilføj eksplicit revalidate eller cache: "no-store" til hentning inde i generateMetadata
  4. Tving en ny implementering for at udelukke en forældet build-cache
  5. Bekræft liveresultatet med Proovd

Next.js vs. andre rammer

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

Tjekliste til hurtig rettelse

  1. Bekræftet rå HTML-output har de korrekte tags (ikke kun browserens DOM)
  2. Tilføjet eksplicit genvalidering eller cache: "no-store" for at hente inde i generateMetadata
  3. Kontrollerede CDN/edge cache-headere for et forældet HIT
  4. Bekræftet, om ruten er fuldstændig statisk uden ISR
  5. Udelukket den sociale platforms egen cache som den egentlige årsag
  6. Bekræftet det endelige live output med Proovd

Ofte stillede spørgsmål

Hvorfor opdateres min og:image i browseren, men ikke på Facebook eller LinkedIn?

Din Next.js-app leverer sandsynligvis allerede det korrekte tag. Platformen viser en kopi, den cachelagde før din rettelse. Brug platformens eget cache-opdateringsværktøj i stedet for at ændre mere kode.

Deaktiverer revalidate: 0 caching helt?

Indstilling af revalidate: 0 fremtvinger effektivt dynamisk gengivelse for den hentning på hver anmodning, svarende til cache: "no-store". Brug det sparsomt, da det fjerner ydelsesfordelen ved caching.

Bekræft, hvad din Next.js-app faktisk serverer

Tjek dine live metadata gratis med Proovd. Det viser præcis, hvad der er i din HTML lige nu, uafhængigt af enhver platforms cache.