use cache
Die use cache
-Direktive kennzeichnet eine Komponente, Funktion oder Datei zur Zwischenspeicherung. Sie kann am Anfang einer Datei verwendet werden, um anzuzeigen, dass alle Funktionen in der Datei zwischenspeicherbar sind, oder inline am Anfang einer Funktion, um diese als zwischenspeicherbar zu markieren. Dies ist eine experimentelle Next.js-Funktion und keine native React-Funktion wie use client
oder use server
.
Aktivieren Sie die Unterstützung für die use cache
-Direktive mit dem dynamicIO
-Flag in Ihrer next.config.ts
-Datei:
Die
use cache
-Direktive wird in Zukunft separat vomdynamicIO
-Flag verfügbar sein.
Zwischenspeicherung ist eine Technik zur Leistungsverbesserung von Webanwendungen durch Speicherung der Ergebnisse von Rendering- oder Datenanfragen. Wenn Sie eine asynchrone Funktion oder APIs verwenden, die von Anfragezeitdaten abhängen, wird Next.js automatisch dynamisches Rendering aktivieren. Sie können die Ergebnisse dieser Operationen explizit zwischenspeichern und die Rendering-Leistung Ihrer Anwendung mit der use cache
-Direktive optimieren.
Die use cache
-Direktive ist eine experimentelle Funktion, die darauf abzielt, die unstable_cache
-Funktion zu ersetzen. Im Gegensatz zu unstable_cache
, das auf die Zwischenspeicherung von JSON-Daten beschränkt ist und manuelle Definition von Revalidierungszeiträumen und -tags erfordert, bietet use cache
mehr Flexibilität. Es ermöglicht die Zwischenspeicherung einer breiteren Palette von Daten, einschließlich allem, was React Server Components (RSC) serialisieren können, sowie Datenabfrage-Ausgaben und Komponentenausgaben.
Zusätzlich verwaltet use cache
Komplexitäten automatisch, indem Eingaben und Ausgaben verfolgt werden, wodurch die Wahrscheinlichkeit von versehentlicher Cachevergiftung verringert wird. Da es Eingaben und Ausgaben serialisiert, können Probleme mit falscher Cacheabfrage vermieden werden.
use cache
-Direktive
Die Next.js use cache
-Direktive ermöglicht die Zwischenspeicherung ganzer Routen, Komponenten und Funktionsrückgabewerte. Wenn Sie eine asynchrone Funktion haben, können Sie diese als zwischenspeicherbar markieren, indem Sie use cache
am Anfang der Datei oder innerhalb des Funktionsbereichs hinzufügen. Dies informiert Next.js, dass der Rückgabewert zwischengespeichert und für nachfolgende Renderings wiederverwendet werden kann.
Hinweis: Funktionen, die die
use cache
-Direktive verwenden, dürfen keine Nebenwirkungen haben, wie z.B. Zustandsänderungen, direktes DOM-Manipulation oder Setzen von Zeitgebern zur Intervallausführung
Revalidierung
Standardmäßig setzt Next.js einen Revalidierungszeitraum von 15 Minuten, wenn Sie die use cache
-Direktive verwenden. Next.js setzt eine Ablaufdauer, die fast unendlich ist, was bedeutet, dass sie für Inhalte geeignet ist, die nicht häufig aktualisiert werden müssen.
Während dieser Revalidierungszeitraum nützlich für Inhalte sein kann, die sich nicht oft ändern, können Sie die APIs cacheLife
und cacheTag
verwenden, um das Cacheverhalten zu konfigurieren:
Beide APIs integrieren sich über Client- und Server-Caching-Schichten hinweg, sodass Sie Ihre Caching-Semantik an einer Stelle konfigurieren und überall anwenden können.
Grundlegendes Beispiel:
Das folgende Beispiel zeigt, wie Sie die cacheLife
-Funktion auf Funktionsebene verwenden, um einen Revalidierungszeitraum von einem Tag für die Funktionsausgabe festzulegen:
Wie Cache-Revalidierung funktioniert
Wenn ein Revalidierungszeitraum von fünfzehn Minuten festgelegt wird, geschieht Folgendes:
- Cache-TREFFER: Wenn innerhalb des 15-Minuten-Fensters eine Anfrage gestellt wird, werden die zwischengespeicherten Daten bereitgestellt und sind ein Cache-TREFFER.
- Veraltete Daten: Wenn die Anfrage nach 15 Minuten erfolgt, wird der zwischengespeicherte Wert weiterhin bereitgestellt, ist aber jetzt als veraltet anzusehen. Next.js wird im Hintergrund einen neuen Cache-Eintrag neu berechnen.
- Cache-MISS: Wenn der Cache-Eintrag abläuft und eine nachfolgende Anfrage gestellt wird, behandelt Next.js dies als Cache-MISS, und die Daten werden neu berechnet und erneut von der Quelle abgerufen.
Zeitbasierte Revalidierung mit cacheLife
Die cacheLife
-Funktion kann nur dort verwendet werden, wo die use cache
-Direktive vorhanden ist, und ermöglicht die Definition zeitbasierter Revalidierungszeiträume basierend auf Cache-Profilen.
Wir empfehlen, bei Verwendung der use cache
-Direktive immer ein Cache-Profil hinzuzufügen, um das Cacheverhalten explizit zu definieren.
Cache-Profile sind Objekte mit folgenden Eigenschaften:
Eigenschaft | Wert | Beschreibung | Anforderung |
---|---|---|---|
stale | number | Dauer, die der Client einen Wert zwischenspeichern soll, ohne den Server zu überprüfen. | Optional |
revalidate | number | Häufigkeit, mit der der Cache auf dem Server aktualisiert werden soll; veraltete Werte können während der Revalidierung bereitgestellt werden. | Optional |
expire | number | Maximale Dauer, für die ein Wert veraltet bleiben kann, bevor auf dynamisches Abrufen umgeschaltet wird; muss länger sein als revalidate . | Optional - Muss länger sein als revalidate |
Die Eigenschaft "stale" unterscheidet sich von der Einstellung staleTimes
dahingehend, dass sie speziell die Client-seitige Router-Zwischenspeicherung steuert. Während staleTimes
eine globale Einstellung ist, die alle Instanzen sowohl dynamischer als auch statischer Daten beeinflusst, ermöglicht die cacheLife
-Konfiguration die Definition von "stale"-Zeiten auf Funktions- oder Routenebene.
Hinweis: Die Eigenschaft "stale" setzt nicht den Header
Cache-control: max-age
. Stattdessen steuert sie den Client-seitigen Router-Cache.
Standard-Cache-Profile
Next.js bietet eine Reihe benannter Cache-Profile, die auf verschiedenen Zeitskalen modelliert sind. Wenn Sie kein Cache-Profil in der cacheLife
-Funktion neben der use cache
-Direktive angeben, wendet Next.js automatisch das "default" Cache-Profil an.
Profil | Stale | Revalidate | Expire | Beschreibung |
---|---|---|---|---|
default | undefined | 15 Minuten | UNENDLICHER_CACHE | Standard-Profil, geeignet für Inhalte, die keine häufigen Updates benötigen |
seconds | undefined | 1 Sekunde | 1 Minute | Für sich schnell ändernde Inhalte, die nahezu Echtzeit-Updates erfordern |
minutes | 5 Minuten | 1 Minute | 1 Stunde | Für Inhalte, die sich innerhalb einer Stunde häufig aktualisieren |
hours | 5 Minuten | 1 Stunde | 1 Tag | Für Inhalte, die täglich aktualisiert werden, aber leicht veraltet sein können |
days | 5 Minuten | 1 Tag | 1 Woche | Für Inhalte, die wöchentlich aktualisiert werden, aber einen Tag alt sein können |
weeks | 5 Minuten | 1 Woche | 1 Monat | Für Inhalte, die monatlich aktualisiert werden, aber eine Woche alt sein können |
max | 5 Minuten | 1 Monat | UNENDLICHER_CACHE | Für sehr stabile Inhalte, die nur selten aktualisiert werden müssen |
Grundbeispiel:
Die verwendeten Zeichenfolgewerte zur Referenzierung von Cache-Profilen tragen keine inhärente Bedeutung; stattdessen dienen sie als semantische Bezeichner. Dies ermöglicht Ihnen, Ihre zwischengespeicherten Inhalte in Ihrer Codebasis besser zu verstehen und zu verwalten.
Definieren wiederverwendbarer Cache-Profile
Sie können ein wiederverwendbares Cache-Profil erstellen, indem Sie es in Ihrer next.config.ts
-Datei definieren. Wählen Sie einen Namen, der Ihrem Anwendungsfall entspricht, und legen Sie Werte für die Eigenschaften stale
, revalidate
und expire
fest. Sie können so viele benutzerdefinierte Cache-Profile erstellen, wie benötigt. Jedes Profil kann über seinen Namen als Zeichenfolgewert an die cacheLife
-Funktion übergeben werden.
Das obige Beispiel speichert 14 Tage zwischen, prüft täglich auf Updates und lässt den Cache nach 14 Tagen ablaufen. Sie können dann dieses Profil in Ihrer gesamten Anwendung über seinen Namen referenzieren:
Überschreiben der Standard-Cache-Profile
Während die Standard-Cache-Profile eine nützliche Möglichkeit bieten, darüber nachzudenken, wie frisch oder veraltet eine bestimmte Ausgabe sein kann, bevorzugen Sie möglicherweise unterschiedlich benannte Profile, um Ihre Caching-Strategien besser abzubilden.
Sie können die Standard-Cache-Profile überschreiben, indem Sie eine neue Konfiguration mit demselben Namen wie die Standardeinstellungen erstellen.
Das folgende Beispiel zeigt, wie das Standard-Cache-Profil "days" überschrieben wird:
Definieren von Cache-Profilen inline
Für spezifische Anwendungsfälle können Sie ein benutzerdefiniertes Cache-Profil festlegen, indem Sie ein Objekt an die cacheLife
-Funktion übergeben:
Dieses Inline-Cache-Profil wird nur auf die Funktion oder Datei angewendet, in der es erstellt wurde. Wenn Sie dasselbe Profil in Ihrer gesamten Anwendung wiederverwenden möchten, können Sie die Konfiguration zur cacheLife
-Eigenschaft Ihrer next.config.ts
-Datei hinzufügen.
Verschachtelte Verwendung von use cache
und cacheLife
Bei der Definition mehrerer Caching-Verhaltensweisen in derselben Route oder Komponentenstruktur wird der äußere Cache, wenn die inneren Caches ihr eigenes cacheLife
-Profil angeben, die kürzeste Cache-Dauer unter ihnen berücksichtigen. Dies gilt nur, wenn der äußere Cache kein eigenes explizites cacheLife
-Profil definiert hat.
Entscheidungshierarchie für Cache-Grenzen:
- Next.js verwendet das kürzeste Cache-Profil, das innerhalb der gesamten
use cache
-Grenze gefunden wird, ohne die innerenuse cache
-Direktiven. - Wenn kein Cache-Profil existiert, gilt das kürzeste Profilzeitintervall von allen inneren
use cache
-Aufrufen für diesesuse cache
. Wenn es keine innerenuse cache
-Aufrufe gibt, wird der Standardwert verwendet. - Innere Caches in zwei Ebenen tiefer beeinflussen den äußeren Cache nicht, da sie ihre Dauer bereits an ihr übergeordnetes Element übergeben haben.
Zum Beispiel wird, wenn Sie die use cache
-Direktive auf Ihrer Seite hinzufügen, ohne ein Cache-Profil anzugeben, implizit das Standard-Cache-Profil angewendet (cacheLife("default")
). Wenn eine in die Seite importierte Komponente die use cache
-Direktive mit ihrem eigenen Cache-Profil verwendet, werden das äußere und innere Cache-Profil verglichen, und die kürzeste in den Profilen festgelegte Dauer wird angewendet.
Und in einer separaten Datei definieren wir die Kindkomponente, die importiert wurde:
Bedarfsgerechte Neuladen mit cacheTag
Ein cacheTag
wird in Kombination mit revalidateTag
verwendet, um Cachedaten bei Bedarf zu bereinigen. Die cacheTag
-Funktion akzeptiert einen einzelnen Zeichenfolgewert oder ein Zeichenfolgenarray.
Im folgenden Beispiel verwendet die getData
-Funktion das "weeks" Cache-Profil und definiert einen cacheTag
für die zwischengespeicherte Ausgabe:
Sie können den Cache dann bei Bedarf mit der revalidateTag
-API in einer anderen Funktion bereinigen, zum Beispiel in einem Routenhandler oder einer Serveraktion:
Weitere Informationen zum Bereinigen von Cachedaten bei Bedarf finden Sie in der revalidateTag
-Dokumentation.
Beispiele
Zwischenspeichern ganzer Routen mit use cache
Die Platzierung von Suspense
-Grenzen in Ihrer Anwendung bestimmt, wie dynamisch Ihre Komponenten sein können. Komponenten innerhalb einer Suspense
-Grenze dürfen dynamisch sein, aber das bedeutet nicht, dass sie automatisch dynamisch sind. Wenn Sie alles zwischenspeichern oder Ihr Inhalt statisch ist, wird Next.js weiterhin eine statische Anwendung generieren. Die Verwendung von Suspense
zeigt an, dass dynamisches Verhalten innerhalb der Grenze erlaubt ist.
Um sicherzustellen, dass Ihre Route statisch bleibt, vermeiden Sie die Verwendung von Suspense
-Grenzen. Wenn Sie sie verwenden müssen, können Sie eine statische Seite aufrechterhalten, indem Sie die use cache
-Direktive sowohl für Layout- als auch für Seitenkomponenten hinzufügen, da sie als separate Einstiegspunkte in Ihrer Anwendung behandelt werden.
Dies wird für Anwendungen empfohlen, die zuvor die Option export const dynamic = "force-cache"
verwendet haben, und wird sicherstellen, dass die gesamte Route vorgerendert wird.
Und in Ihrer page.tsx
-Datei können Sie die use cache
-Direktive oben in der Datei hinzufügen und ein Cache-Profil definieren:
Zwischenspeichern der Komponentenausgabe mit use cache
Sie können use cache
auf Komponentenebene verwenden, um beliebige Abrufe oder Berechnungen innerhalb dieser Komponente zu speichern. Wenn Sie die Komponente in Ihrer gesamten Anwendung wiederverwenden, kann sie denselben Cache-Eintrag teilen, solange die Props dieselbe Struktur beibehalten.
Die Props werden serialisiert und bilden einen Teil des Cache-Schlüssels. Wenn Sie die gleiche Komponente an verschiedenen Stellen in Ihrer Anwendung verwenden, wird der Cache-Eintrag wiederverwendet, solange die serialisierten Props in jeder Instanz den gleichen Wert erzeugen.
Zwischenspeichern von Funktionsergebnissen mit use cache
Da Sie use cache
zu jeder asynchronen Funktion hinzufügen können, sind Sie nicht darauf beschränkt, nur Komponenten oder Routen zu cachen. Sie möchten vielleicht eine Netzwerkanfrage oder Datenbankabfrage zwischenspeichern oder etwas berechnen, das sehr langsam ist. Wenn Sie use cache
zu einer Funktion hinzufügen, die diese Art von Arbeit enthält, wird sie cachebar, und bei der Wiederverwendung teilt sie den gleichen Cache-Eintrag.