Datenabruf und Caching
Beispiele
Diese Anleitung führt Sie durch die Grundlagen des Datenabrufs und Cachings in Next.js und bietet praktische Beispiele und Best Practices.
Hier ist ein minimales Beispiel für Datenabruf in Next.js:
Dieses Beispiel zeigt einen grundlegenden serverseitigen Datenabruf mit der fetch
-API in einer asynchronen React-Serverkomponente.
Referenz
fetch
- React
cache
- Next.js
unstable_cache
Beispiele
Datenabruf auf dem Server mit der fetch
-API
Diese Komponente ruft eine Liste von Blogbeiträgen ab und zeigt sie an. Die Antwort von fetch
wird automatisch zwischengespeichert.
Wenn Sie keine dynamischen APIs an anderer Stelle in dieser Route verwenden, wird sie während next build
zu einer statischen Seite vorgerendert. Die Daten können dann mit Inkrementeller Statischer Regeneration aktualisiert werden.
Wenn Sie die Antwort von fetch
nicht zwischenspeichern möchten, können Sie Folgendes tun:
Datenabruf auf dem Server mit einem ORM oder einer Datenbank
Diese Komponente ruft eine Liste von Blogbeiträgen ab und zeigt sie an. Die Antwort aus der Datenbank wird standardmäßig nicht zwischengespeichert, könnte aber mit zusätzlicher Konfiguration zwischengespeichert werden.
Wenn Sie keine dynamischen APIs an anderer Stelle in dieser Route verwenden, wird sie während next build
zu einer statischen Seite vorgerendert. Die Daten können dann mit Inkrementeller Statischer Regeneration aktualisiert werden.
Um zu verhindern, dass die Seite vorgerendert wird, können Sie Folgendes zu Ihrer Datei hinzufügen:
Üblicherweise verwenden Sie jedoch Funktionen wie cookies
, headers
oder das Lesen der eingehenden searchParams
von den Seitenprops, was die Seite automatisch dynamisch rendert. In diesem Fall benötigen Sie force-dynamic
nicht explizit.
Datenabruf auf dem Client
Wir empfehlen zunächst, Daten serverseitig abzurufen.
Es gibt jedoch immer noch Fälle, in denen clientseitiger Datenabruf Sinn macht. In diesen Szenarien können Sie manuell fetch
in einem useEffect
aufrufen (nicht empfohlen) oder sich auf beliebte React-Bibliotheken in der Community (wie SWR oder React Query) für Client-Abruf verlassen.
Zwischenspeichern von Daten mit einem ORM oder einer Datenbank
Sie können die unstable_cache
-API verwenden, um die Antwort zwischenzuspeichern und Seiten beim Ausführen von next build
vorzurendern.
Dieses Beispiel speichert das Ergebnis der Datenbankabfrage für 1 Stunde (3600 Sekunden) zwischen. Es fügt außerdem das Cache-Tag posts
hinzu, das dann mit Inkrementeller Statischer Regeneration ungültig gemacht werden kann.
Wiederverwendung von Daten über mehrere Funktionen hinweg
Next.js verwendet APIs wie generateMetadata
und generateStaticParams
, bei denen Sie die gleichen Daten verwenden müssen, die in der page
abgerufen wurden.
Bei Verwendung von fetch
werden Anfragen automatisch memoisiert. Das bedeutet, Sie können dieselbe URL mit denselben Optionen sicher aufrufen, und es wird nur eine Anfrage gestellt.
Wenn Sie nicht fetch
verwenden und stattdessen ein ORM oder eine Datenbank direkt nutzen, können Sie Ihre Datenabrufe mit der React-Funktion cache
umwickeln. Dies wird Doppelanfragen eliminieren und nur eine Abfrage durchführen.
Zwischengespeicherte Daten neu validieren
Erfahren Sie mehr über das Neu-Validieren zwischengespeicherter Daten mit Inkrementeller Statischer Regeneration.
Muster
Paralleler und sequenzieller Datenabruf
Beim Datenabruf in Komponenten müssen Sie zwei Datenabrufmuster beachten: Parallel und Sequenziell.
- Sequenziell: Anfragen in einer Komponentenhierarchie sind voneinander abhängig. Dies kann zu längeren Ladezeiten führen.
- Parallel: Anfragen in einer Route werden sofort initiiert und laden Daten gleichzeitig. Dies reduziert die Gesamtzeit für den Datenabruf.
Sequenzieller Datenabruf
Wenn Sie verschachtelte Komponenten haben und jede Komponente ihre eigenen Daten abruft, dann erfolgt der Datenabruf sequenziell, wenn diese Datenanfragen nicht memoisiert sind.
Es kann Fälle geben, in denen Sie dieses Muster wünschen, weil ein Abruf vom Ergebnis eines anderen abhängt. Beispielsweise beginnt die Playlists
-Komponente erst mit dem Datenabruf, wenn die Artist
-Komponente ihre Daten abgerufen hat, da Playlists
von der artistID
abhängt:
Sie können loading.js
(für Routensegmente) oder React <Suspense>
(für verschachtelte Komponenten) verwenden, um einen sofortigen Ladestand anzuzeigen, während React das Ergebnis streamt.
Dies verhindert, dass die gesamte Route durch Datenanfragen blockiert wird, und der Benutzer kann mit den bereits fertigen Teilen der Seite interagieren.
Paralleler Datenabruf
Standardmäßig werden Layout- und Seitensegmente parallel gerendert. Das bedeutet, Anfragen werden parallel initiiert.
Aufgrund der Natur von async
/await
blockiert eine abgerufene Anfrage innerhalb desselben Segments oder derselben Komponente alle Anfragen darunter.
Um Daten parallel abzurufen, können Sie Anfragen initiieren, indem Sie sie außerhalb der Komponenten definieren, die die Daten verwenden. Dies spart Zeit, da beide Anfragen parallel gestartet werden, jedoch sieht der Benutzer das gerenderte Ergebnis erst, wenn beide Promises aufgelöst sind.
Im folgenden Beispiel werden die Funktionen getArtist
und getAlbums
außerhalb der Page
-Komponente definiert und innerhalb der Komponente mit Promise.all
initiiert:
Zusätzlich können Sie eine Suspense-Grenze hinzufügen, um die Renderarbeit aufzuteilen und einen Teil des Ergebnisses so schnell wie möglich anzuzeigen.
Daten vorabladen
Eine weitere Möglichkeit, Wasserfall-Effekte zu vermeiden, ist das Preloading-Muster durch Erstellen einer Hilfsfunktion, die Sie über blockierenden Anfragen gezielt aufrufen. Beispielsweise blockiert checkIsAvailable()
das Rendering von <Item/>
, daher können Sie preload()
vor dem Rendering aufrufen, um die Datenabhängigkeiten von <Item/>
frühzeitig zu initiieren. Bis <Item/>
gerendert wird, sind seine Daten bereits abgerufen.
Beachten Sie, dass die preload
-Funktion checkIsAvailable()
nicht blockiert.
Hinweis: Die "preload"-Funktion kann auch einen beliebigen Namen haben, da es sich um ein Muster und nicht um eine API handelt.
Verwendung von React cache
und server-only
mit dem Preload-Muster
Sie können die cache
-Funktion, das preload
-Muster und das server-only
-Paket kombinieren, um ein Daten-Fetching-Utility zu erstellen, das in Ihrer App verwendet werden kann.
Mit diesem Ansatz können Sie Daten gezielt vorab abrufen, Antworten zwischenspeichern und sicherstellen, dass das Daten-Fetching nur auf dem Server stattfindet.
Die Exporte von utils/get-item
können von Layouts, Seiten oder anderen Komponenten verwendet werden, um die Kontrolle über den Zeitpunkt des Datenabrufs eines Elements zu haben.
Hinweis:
- Wir empfehlen die Verwendung des
server-only
-Pakets, um sicherzustellen, dass Daten-Fetching-Funktionen des Servers niemals auf dem Client verwendet werden.
Verhindern der Offenlegung sensibler Daten auf dem Client
Wir empfehlen die Verwendung der Taint-APIs von React, taintObjectReference
und taintUniqueValue
, um zu verhindern, dass ganze Objektinstanzen oder sensible Werte an den Client übergeben werden.
Um Tainting in Ihrer Anwendung zu aktivieren, setzen Sie die Next.js-Konfigurationsoption experimental.taint
auf true
:
Übergeben Sie dann das Objekt oder den Wert, den Sie taggen möchten, an die Funktionen experimental_taintObjectReference
oder experimental_taintUniqueValue
: