← Blog

Next.js Lýsigögn eru ekki uppfærð? Hér er hvers vegna

Þú uppfærir generateMetadata, endurdreifir og gamla titillinn eða myndin birtist enn þegar þú deilir hlekknum. Hér er hvernig á að segja hvort það sé skyndiminnislag eða kóðavilla.

Ertu ekki viss um hvort þetta sé kóðinn þinn eða skyndiminni?

Athugaðu það ókeypis með Proovd. Það sýnir nákvæmlega hvaða lýsigögn lifandi vefslóð þín er að þjóna núna, óháð eigin skyndiminni hvers vettvangs.

Fljótt svar

  • Flest tilvik eru eigin skyndiminni Next.js eða CDN skyndiminni sem þjónar gömlu HTML, ekki kóða villu
  • generateMetadata í miðlarahluti keyrir aðeins aftur þegar undirliggjandi skyndiminni til að sækja hann endurgildist
  • Restin er venjulega skyndiminni pallsins (Facebook, LinkedIn, osfrv.), ekki Next.js. Athugaðu hvort tveggja áður en þú gerir ráð fyrir annað hvort

Endurtakanlegt dæmi

Þetta lítur rétt út en mun halda áfram að birta gömul lýsigögn eftir efnisbreytingu:

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 símtalið hér er sjálfgefið í skyndiminni af gagnaskyndiminni Next.js. Ef post.title eða post.image breytist í CMS mun þessi aðgerð ekki sjá nýja gildið fyrr en skyndiminni hefur endurgilt. Með enga skýra stefnu getur það þýtt ekki fyrr en í næstu fullri byggingu.

Af hverju lýsigögn þín eru ekki uppfærð

Undirliggjandi niðurhal er í skyndiminni

Sjálfgefið er að fetch() inni í generateMetadata er ótímabundið í skyndiminni í App Router. Lagfærðu með því að setja skýran endurfullgildingarglugga:

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

Eða afþakkaðu skyndiminni algjörlega fyrir þá beiðni:

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

Leiðin er statísk mynduð

Ef leiðin notar generateStaticParams án endurfullgildingar stillt, er öll leiðin, lýsigögn innifalin, bakuð inn á byggingartíma. Að bæta við export const revalidate = 3600; á síðustigi þvingar fram reglubundna endurnýjun.

CDN eða brún skyndiminni er að þjóna gamla HTML

Jafnvel þó að smíðin þín sé rétt, getur Vercel's Edge Network, Cloudflare, eða annað CDN fyrir framan appið þitt þjónað HTML-svar í skyndiminni sem er á undan lagfæringunni þinni. Athugaðu svarhausa:

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

Leitaðu að x-vercel-cache: HIT eða svipuðum CDN haus. HIT þýðir að þú ert að skoða afrit í skyndiminni, ekki nýjustu dreifinguna þína.

opengraph-image.ts er ekki að taka upp ný gögn

Ef þú ert að nota skráabyggða opengraph-image.ts venjuna, býr Next.js sjálfgefið til kyrrstæða mynd á byggingartíma. Kvikt efni inni í því er háð sömu skyndiminnisreglum og hver annar miðlarahluti, svo bættu við skýrri endurfullgildingu ef það þarf að vera ferskt.

Það er í raun skyndiminni pallsins, ekki þitt

Algengasta falska viðvörunin. Forritið þitt getur þjónað fullkomlega ferskum lýsigögnum á meðan Facebook, LinkedIn eða Slack eru enn að sýna forskoðun sem þau komu í skyndiminni fyrir dögum síðan. Staðfestu hvað þjónninn þinn er að senda áður en þú snertir einhvern Next.js kóða. Sjá leiðbeiningar okkar um að hreinsa OG skyndiminni á hverjum vettvangi.

Skref-fyrir-skref lagfæringarleiðbeiningar

  1. Hlaupa curl -s https://yoursite.com/page | grep -i "og:" til að sjá hvað þjónninn þinn sendir í raun og veru
  2. Athugaðu hvort CDN skyndiminni HIT haus með curl -I https://yoursite.com/page
  3. Bættu við berum orðum revalidate eða skyndiminni: "ekki verslun" til að sækja inni í generateMetadata
  4. Þvingaðu nýja dreifingu til að útiloka gamaldags skyndiminni
  5. Staðfestu niðurstöðuna í beinni með Proovd

Next.js á móti öðrum ramma

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

Gátlisti til fljótlegra laga

  1. Staðfest hrátt HTML úttak hefur rétt merki (ekki bara DOM vafrans)
  2. Bætt við skýrri endurgildingu eða skyndiminni: „engin verslun“ til að sækja inni generateMetadata
  3. Athugaði CDN/edge skyndiminnihausa fyrir gamaldags HIT
  4. Staðfest hvort leiðin sé alveg kyrrstæð án ISR
  5. Útilokað er að eigin skyndiminni samfélagsvettvangsins sé raunveruleg orsök
  6. Staðfesti lokaúttakið í beinni með Proovd

Algengar spurningar

Af hverju uppfærist og:image minn í vafranum en ekki á Facebook eða LinkedIn?

Next.js appið þitt er líklega þegar að þjóna réttu merki. Vettvangurinn sýnir afrit sem hann var í skyndiminni áður en þú lagfærði þig. Notaðu eigin skyndiminnisuppfærsluverkfæri þess vettvangs frekar en að breyta meiri kóða.

Gerir endurgilda: 0 algjörlega óvirka skyndiminni?

Stilling revalidate: 0 þvingar í raun fram kraftmikla flutning fyrir þá söfnun fyrir hverja beiðni, svipað og skyndiminni: „ekki geyma“. Notaðu það sparlega þar sem það fjarlægir frammistöðuávinninginn af skyndiminni.

Staðfestu hvað Next.js appið þitt þjónar í raun

Athugaðu lifandi lýsigögn þín ókeypis með Proovd. Það sýnir nákvæmlega hvað er í HTML þínum núna, óháð skyndiminni hvers vettvangs.