Hirefullstack – Software Engineering & IT-Beratung aus Berlin
← Zur Übersicht
Kern 10 Min Lesezeit

Revalidierung

Nach dem Speichern genau das neu holen, was sich geändert hat

In einem Satz

Statt Caching auszuschalten, sagst du Next.js gezielt Bescheid, wenn etwas veraltet ist. Dann bleibt die Seite schnell und ist trotzdem aktuell.

Die vorige Lektion endete mit einem Dilemma: Zwischenspeichern macht schnell, aber die Daten veralten. Die Auflösung ist nicht, den Speicher abzuschalten – sondern ihn zum richtigen Zeitpunkt für ungültig zu erklären.

Zwei Wege

wege.txt
Nach Zeit          revalidate: 60
                   "höchstens eine Minute alt" – ohne dass du
                   etwas tun musst. Gut für Inhalte von außen.

Auf Zuruf          revalidatePath() / revalidateTag()
                   "genau jetzt ist es veraltet" – nachdem DU
                   etwas geändert hast. Gut für eigene Daten.

Der Unterschied in einem Satz: Nach Zeit rätst du, wie schnell etwas veraltet. Auf Zuruf weißt du es.

Nach Zeit

zeit.tsx
// Für die ganze Seite
export const revalidate = 3600;   // stündlich

// Oder pro Abfrage
const kurse = await fetch(url, { next: { revalidate: 300 } });
Gut zu wissen Der erste Aufruf nach Ablauf bekommt noch das Alte

Next.js liefert die gespeicherte Fassung aus und baut im Hintergrund neu. Erst der nächste Besucher sieht die frischen Daten. Das ist Absicht: Niemand muss auf den Neuaufbau warten. Fachbegriff dafür ist ISRStatische Seite mit Verfallsdatum: Nach der eingestellten Zeit erzeugt Next.js sie im Hintergrund neu.Ausgeschrieben Incremental Static Regeneration. Eingestellt über `revalidate`..

Auf Zuruf

app/aktionen.ts
"use server";

import { revalidatePath, revalidateTag } from "next/cache";

export async function artikelSpeichern(id: string, daten: FormData) {
  await db.artikel.update({ where: { id }, data: … });

  // Variante 1: eine bestimmte Adresse
  revalidatePath("/blog/" + id);
  revalidatePath("/blog");            // die Übersicht auch

  // Variante 2: alles, was dieses Etikett trägt
  revalidateTag("artikel");
}
etiketten.tsx
// Beim Holen ein Etikett vergeben …
await fetch(url, { next: { tags: ["artikel"] } });

// … und später alles damit für ungültig erklären.
revalidateTag("artikel");
Etiketten sind praktisch, wenn dieselben Daten auf vielen Seiten vorkommen und du sie nicht alle aufzählen willst.
Stolperstein Die Übersicht wird gern vergessen

Nach dem Bearbeiten eines Artikels ist nicht nur /blog/mein-artikel veraltet, sondern auch /blog und vielleicht die Startseite. Wer nur den Einzelfall abräumt, wundert sich, warum die Liste noch den alten Titel zeigt. Etiketten lösen genau das.

Wann was

Nimm es, wenn …
  • +

    Nach Zeit für Daten aus fremder Hand: Wechselkurse, Wetter, ein fremder Blog-Feed

  • +

    Auf Zuruf für alles, was du selbst änderst – aus einer Server Action heraus

  • +

    Beides zusammen: Zuruf als Regelfall, Zeit als Sicherheitsnetz

Lass es, wenn …
  • no-store überall, nur um dem Thema auszuweichen

  • Sehr kurze Zeiten (revalidate = 1) – das ist dynamisch mit Extraschritten

  • Nach dem Speichern gar nichts tun und hoffen

Tipp Für Redakteure: der Umweg über einen Route Handler

Wenn die Daten aus einem fremden Redaktionssystem kommen, kann dieses nach dem Veröffentlichen eine Adresse deiner Seite aufrufen (einen Webhook). Darin rufst du revalidateTag(...) auf. So wird die Seite in dem Moment aktuell, in dem jemand veröffentlicht – ohne dass du eine Zeitspanne raten musst.

Genauer erklärt: was revalidate NICHT anfasst optional

revalidatePath räumt den serverseitigen Speicher ab. Der Router CacheDer Zwischenspeicher im Browser: Beim Zurücknavigieren zeigt Next.js die Seite sofort aus dem Speicher. im Browser des Nutzers ist davon zunächst unberührt – deshalb sieht man nach dem Speichern manchmal trotzdem den alten Stand.

browser.tsx
"use client";
import { useRouter } from "next/navigation";

const router = useRouter();
router.refresh();     // holt die aktuelle Seite frisch vom Server
Gut zu wissen Aus einer Server Action heraus passiert das automatisch

Rufst du revalidatePath innerhalb einer Server Action auf, aktualisiert Next.js die aktuelle Ansicht gleich mit. router.refresh() brauchst du nur, wenn die Änderung an React vorbei passiert ist.

Sitzt das schon?

4 Fragen zu dieser Lektion. Falsche Antworten landen in deiner Statistik.

Hirefullstack

Ihr braucht React-Verstärkung im Team?

Wir bauen seit Jahren React- und Next.js-Anwendungen für Kunden in ganz Deutschland – als einzelner Experte, als Verstärkung fürs Bestandsteam oder als komplettes Scrum-Team.

Projekt besprechen →