← Blog

Next.js Metatiedot eivät päivity? Tässä on miksi

Päivität generateMetadata, asennat uudelleen ja vanha otsikko tai kuva näkyy edelleen, kun jaat linkin. Näin voit selvittää, onko kyseessä välimuistitaso vai koodivirhe.

Etkö ole varma, onko se sinun koodisi vai välimuisti?

Tarkista se ilmaiseksi käyttämällä Proovd. Se näyttää tarkalleen, mitä metatietoja live-URL-osoitteesi palvelee juuri nyt, riippumatta alustan omasta välimuistista.

Pikavastaus

  • Useimmat tapaukset ovat Next.js:n omaa datavälimuistia tai CDN-välimuistia, joka palvelee vanhentunutta HTML-koodia, ei koodivirhettä
  • generateMetadata palvelinkomponentissa suoritetaan uudelleen vain, kun sen taustalla oleva hakuvälimuisti vahvistetaan uudelleen
  • Loput ovat yleensä alustan välimuistia (Facebook, LinkedIn jne.), eivät Next.js. Tarkista molemmat ennen kuin otat jommankumman

Toistettava esimerkki

Tämä näyttää oikealta, mutta jatkaa vanhentuneiden metatietojen näyttämistä sisällön muutoksen jälkeen:

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-kutsu tässä välimuistissa on Next.js:n datavälimuisti oletusarvoisesti. Jos post.title tai post.image muuttuu kohdassa CMS, tämä toiminto ei näe uutta arvoa ennen kuin välimuisti on tarkistettu. Ilman nimenomaista strategiaa se voi tarkoittaa vasta seuraavaa täyttä versiota.

Miksi metatietosi eivät päivity

Taustalla oleva haku on välimuistissa

Oletusarvoisesti fetch(), joka sijaitsee tunnuksen generateMetadata sisällä, on välimuistissa rajoituksetta App Routerissa. Korjaa asettamalla eksplisiittinen vahvistusikkuna:

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

Tai lopeta välimuistin tallentaminen kokonaan kyseiselle pyynnölle:

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

Reitti luodaan staattisesti

Jos reitti käyttää parametria generateStaticParams ilman uudelleenvalidointia, koko reitti metatiedot mukaan lukien luodaan rakennusvaiheessa. export const revalidate = 3600; lisääminen sivutasolle pakottaa säännöllisen uudelleenmuodostuksen.

CDN tai reunavälimuisti palvelee vanhaa HTML-koodia

Vaikka koontiversiosi olisi oikea, Vercel's Edge Network, Cloudflare tai jokin muu CDN sovelluksesi edessä voi näyttää välimuistissa olevan HTML-vastauksen, joka on ennen korjaustasi. Tarkista vastausotsikot:

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

Etsi x-vercel-cache: HIT tai vastaava CDN-otsikko. HIT tarkoittaa, että katsot välimuistissa olevaa kopiota, et viimeisintä käyttöönottoasi.

opengraph-image.ts ei poimi uutta tietoa

Jos käytät tiedostopohjaista käytäntöä opengraph-image.ts, Next.js luo oletuksena staattisen kuvan rakennusaikana. Sen sisällä olevaan dynaamiseen sisältöön sovelletaan samoja välimuistisääntöjä kuin mihin tahansa muuhun palvelinkomponenttiin, joten lisää nimenomainen uudelleentarkistus, jos sen on pysyttävä tuoreena.

Se on itse asiassa alustan välimuisti, ei sinun

Yleisin väärä hälytys. Sovelluksesi voi näyttää täysin tuoreita metatietoja, kun Facebook, LinkedIn tai Slack näyttävät edelleen esikatselun, jonka ne ovat tallentaneet välimuistiin päiviä sitten. Varmista, mitä palvelimesi lähettää, ennen kuin kosketat mitään Next.js-koodia. Katso opas OG-välimuistin tyhjentämiseen kaikilla alustoilla.

Vaiheittainen korjausopas

  1. Suorita curl -s https://yoursite.com/page | grep -i "og:" nähdäksesi, mitä palvelimesi todella lähettää
  2. Tarkista CDN välimuisti HIT otsikko curl -I https://yoursite.com/page
  3. Lisää eksplisiittinen revalidate tai cache: "no-store" hauille generateMetadata
  4. Pakota uusi käyttöönotto sulkeaksesi pois vanhentuneen koontivälimuistin
  5. Vahvista reaaliaikainen tulos käyttämällä Proovd

Next.js vs. muut kehykset

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

Pikakorjauksen tarkistuslista

  1. Vahvistetussa raaka-HTML-tulosteessa on oikeat tagit (ei vain selaimen DOM)
  2. Lisätty eksplisiittinen uudelleentarkistus tai välimuisti: "no-store" noutamiseen generateMetadata sisällä
  3. Tarkistettiin CDN/edge-välimuistin otsikot vanhentuneen HIT:n varalta
  4. Vahvistettiin, onko reitti täysin staattinen ilman ISR
  5. Suljettu pois sosiaalisen alustan oman välimuistin todellisena syynä
  6. Vahvistettiin lopullinen live-ulostulo numerolla Proovd

Usein kysytyt kysymykset

Miksi og:image päivittyy selaimessa, mutta ei Facebook tai LinkedIn?

Sovelluksesi Next.js näyttää jo todennäköisesti oikean tunnisteen. Alusta näyttää kopion, joka on tallennettu välimuistiin ennen korjausta. Käytä kyseisen alustan omaa välimuistin päivitystyökalua koodin muuttamisen sijaan.

Poistaako revalidating: 0 välimuistin tallennuksen kokonaan käytöstä?

Asetus revalidate: 0 pakottaa tehokkaasti dynaamisen hahmontamisen kyseiselle haulle jokaisessa pyynnössä, kuten cache: "no-store". Käytä sitä säästeliäästi, koska se poistaa välimuistin suorituskykyedun.

Varmista, mitä Next.js sovelluksesi todella palvelee

Tarkista live-metatietosi ilmaiseksi käyttämällä Proovd. Se näyttää tarkalleen, mitä HTML-koodissasi on juuri nyt, riippumatta alustan välimuistista.