getStaticPaths
Wenn Sie eine Funktion namens getStaticPaths
aus einer Seite exportieren, die Dynamische Routen verwendet, wird Next.js alle von getStaticPaths
angegebenen Pfade statisch vor-rendern.
import type {
InferGetStaticPropsType,
GetStaticProps,
GetStaticPaths,
} from 'next'
type Repo = {
name: string
stargazers_count: number
}
export const getStaticPaths = (async () => {
return {
paths: [
{
params: {
name: 'next.js',
},
}, // Siehe Abschnitt "paths" unten
],
fallback: true, // false oder "blocking"
}
}) satisfies GetStaticPaths
export const getStaticProps = (async (context) => {
const res = await fetch('https://api.github.com/repos/vercel/next.js')
const repo = await res.json()
return { props: { repo } }
}) satisfies GetStaticProps<{
repo: Repo
}>
export default function Page({
repo,
}: InferGetStaticPropsType<typeof getStaticProps>) {
return repo.stargazers_count
}
export async function getStaticPaths() {
return {
paths: [
{
params: {
name: 'next.js',
},
}, // Siehe Abschnitt "paths" unten
],
fallback: true, // false oder "blocking"
}
}
export async function getStaticProps() {
const res = await fetch('https://api.github.com/repos/vercel/next.js')
const repo = await res.json()
return { props: { repo } }
}
export default function Page({ repo }) {
return repo.stargazers_count
}
Rückgabewerte von getStaticPaths
Die Funktion getStaticPaths
sollte ein Objekt mit den folgenden erforderlichen Eigenschaften zurückgeben:
paths
Der paths
-Schlüssel bestimmt, welche Pfade vorgerendert werden. Angenommen, Sie haben eine Seite mit Dynamischen Routen namens pages/posts/[id].js
. Wenn Sie getStaticPaths
von dieser Seite exportieren und Folgendes für paths
zurückgeben:
return {
paths: [
{ params: { id: '1' }},
{
params: { id: '2' },
// Bei konfigurierter i18n kann auch das Locale für den Pfad zurückgegeben werden
locale: "en",
},
],
fallback: ...
}
Dann wird Next.js während next build
die Seiten /posts/1
und /posts/2
statisch generieren, wobei die Seitenkomponente in pages/posts/[id].js
verwendet wird.
Die Werte für jedes params
-Objekt müssen den Parametern entsprechen, die im Seitennamen verwendet werden:
- Wenn der Seitenname
pages/posts/[postId]/[commentId]
lautet, sollteparams
postId
undcommentId
enthalten. - Wenn der Seitenname Catch-all-Routen wie
pages/[...slug]
verwendet, sollteparams
slug
enthalten (was ein Array ist). Wenn dieses Array['hello', 'world']
ist, generiert Next.js die Seite statisch unter/hello/world
. - Wenn die Seite eine optionale Catch-all-Route verwendet, verwenden Sie
null
,[]
,undefined
oderfalse
, um die Root-Route zu rendern. Wenn Sie zum Beispielslug: false
fürpages/[[...slug]]
angeben, generiert Next.js die Seite/
statisch.
Die params
-Strings sind case-sensitive und sollten idealerweise normalisiert werden, um sicherzustellen, dass die Pfade korrekt generiert werden. Wenn zum Beispiel WoRLD
für einen Parameter zurückgegeben wird, wird dies nur übereinstimmen, wenn WoRLD
der tatsächlich besuchte Pfad ist, nicht world
oder World
.
Unabhängig vom params
-Objekt kann ein locale
-Feld zurückgegeben werden, wenn i18n konfiguriert ist, wodurch das Locale für den generierten Pfad konfiguriert wird.
fallback: false
Wenn fallback
false
ist, führt jeder Pfad, der nicht von getStaticPaths
zurückgegeben wird, zu einer 404-Seite.
Wenn next build
ausgeführt wird, prüft Next.js, ob getStaticPaths
fallback: false
zurückgegeben hat, und baut dann nur die von getStaticPaths
zurückgegebenen Pfade. Diese Option ist nützlich, wenn Sie eine kleine Anzahl von Pfaden erstellen müssen oder neue Seitendaten nicht oft hinzugefügt werden. Wenn Sie feststellen, dass Sie mehr Pfade hinzufügen müssen und fallback: false
haben, müssen Sie next build
erneut ausführen, damit die neuen Pfade generiert werden können.
Das folgende Beispiel rendert einen Blogbeitrag pro Seite namens pages/posts/[id].js
vor. Die Liste der Blogbeiträge wird von einem CMS abgerufen und von getStaticPaths
zurückgegeben. Dann werden für jede Seite die Beitragsdaten von einem CMS mit getStaticProps
abgerufen.
function Post({ post }) {
// Beitrag rendern...
}
// Diese Funktion wird zur Build-Zeit aufgerufen
export async function getStaticPaths() {
// Externen API-Endpunkt aufrufen, um Beiträge abzurufen
const res = await fetch('https://.../posts')
const posts = await res.json()
// Pfade basierend auf Beiträgen ermitteln, die vorgerendert werden sollen
const paths = posts.map((post) => ({
params: { id: post.id },
}))
// Nur diese Pfade werden zur Build-Zeit vorgerendert.
// { fallback: false } bedeutet, dass andere Routen zu 404 führen.
return { paths, fallback: false }
}
// Wird auch zur Build-Zeit aufgerufen
export async function getStaticProps({ params }) {
// params enthält die Beitrags-ID.
// Wenn die Route z.B. /posts/1 ist, dann ist params.id 1
const res = await fetch(`https://.../posts/${params.id}`)
const post = await res.json()
// Beitragsdaten via Props an die Seite übergeben
return { props: { post } }
}
export default Post
fallback: true
Wenn fallback
true
ist, ändert sich das Verhalten von getStaticProps
wie folgt:
- Die von
getStaticPaths
zurückgegebenen Pfade werden zur Build-Zeit vongetStaticProps
zuHTML
gerendert. - Pfade, die zur Build-Zeit nicht generiert wurden, führen nicht zu einer 404-Seite. Stattdessen serviert Next.js beim ersten Aufruf eines solchen Pfads eine "Fallback"-Version der Seite. Webcrawler wie Google erhalten keinen Fallback, sondern der Pfad verhält sich wie bei
fallback: 'blocking'
. - Wenn auf eine Seite mit
fallback: true
übernext/link
odernext/router
(clientseitig) navigiert wird, serviert Next.js keinen Fallback, sondern die Seite verhält sich wiefallback: 'blocking'
. - Im Hintergrund generiert Next.js den angeforderten Pfad statisch als
HTML
undJSON
. Dazu gehört die Ausführung vongetStaticProps
. - Nach Abschluss erhält der Browser das
JSON
für den generierten Pfad. Dies wird verwendet, um die Seite automatisch mit den erforderlichen Props zu rendern. Aus Benutzersicht wird die Seite von der Fallback-Seite zur vollständigen Seite gewechselt. - Gleichzeitig fügt Next.js diesen Pfad zur Liste der vorgerenderten Seiten hinzu. Nachfolgende Anfragen an denselben Pfad liefern die generierte Seite wie andere zur Build-Zeit vorgerenderte Seiten.
Gut zu wissen:
fallback: true
wird nicht unterstützt, wennoutput: 'export'
verwendet wird.
Wann ist fallback: true
nützlich?
fallback: true
ist nützlich, wenn Ihre App eine sehr große Anzahl statischer Seiten hat, die von Daten abhängen (z.B. ein sehr großer E-Commerce-Shop). Wenn Sie alle Produktseiten vorrendern möchten, würden die Builds sehr lange dauern.
Stattdessen können Sie eine kleine Teilmenge der Seiten statisch generieren und für den Rest fallback: true
verwenden. Wenn jemand eine noch nicht generierte Seite anfordert, sieht der Benutzer die Seite mit einem Ladeindikator oder einer Skelettkomponente.
Kurz darauf wird getStaticProps
fertiggestellt und die Seite mit den angeforderten Daten gerendert. Ab jetzt erhält jeder, der dieselbe Seite anfordert, die statisch vorgerenderte Seite.
Dies stellt sicher, dass Benutzer immer eine schnelle Erfahrung haben, während schnelle Builds und die Vorteile der statischen Generierung erhalten bleiben.
fallback: true
aktualisiert nicht generierte Seiten. Dafür siehe Inkrementelle Statische Regenerierung.
fallback: 'blocking'
Wenn fallback
'blocking'
ist, warten neue Pfade, die nicht von getStaticPaths
zurückgegeben werden, auf die Generierung des HTML
, identisch zu SSR (daher blocking), und werden dann für zukünftige Anfragen zwischengespeichert, sodass dies nur einmal pro Pfad geschieht.
getStaticProps
verhält sich wie folgt:
- Die von
getStaticPaths
zurückgegebenen Pfade werden zur Build-Zeit vongetStaticProps
zuHTML
gerendert. - Pfade, die zur Build-Zeit nicht generiert wurden, führen nicht zu einer 404-Seite. Stattdessen führt Next.js beim ersten Aufruf SSR durch und gibt das generierte
HTML
zurück. - Nach Abschluss erhält der Browser das
HTML
für den generierten Pfad. Aus Benutzersicht wechselt es von "der Browser fordert die Seite an" zu "die vollständige Seite ist geladen". Es gibt keinen flüchtigen Lade-/Fallback-Zustand. - Gleichzeitig fügt Next.js diesen Pfad zur Liste der vorgerenderten Seiten hinzu. Nachfolgende Anfragen an denselben Pfad liefern die generierte Seite wie andere zur Build-Zeit vorgerenderte Seiten.
fallback: 'blocking'
aktualisiert generierte Seiten standardmäßig nicht. Um generierte Seiten zu aktualisieren, verwenden Sie Inkrementelle Statische Regenerierung in Verbindung mit fallback: 'blocking'
.
Gut zu wissen:
fallback: 'blocking'
wird nicht unterstützt, wennoutput: 'export'
verwendet wird.
Fallback-Seiten
In der "Fallback"-Version einer Seite:
- Die Props der Seite sind leer.
- Mit dem Router können Sie erkennen, ob der Fallback gerendert wird:
router.isFallback
isttrue
.
Das folgende Beispiel zeigt die Verwendung von isFallback
:
import { useRouter } from 'next/router'
function Post({ post }) {
const router = useRouter()
// Wenn die Seite noch nicht generiert wurde, wird dies angezeigt,
// bis getStaticProps() fertig ist
if (router.isFallback) {
return <div>Laden...</div>
}
// Beitrag rendern...
}
// Diese Funktion wird zur Build-Zeit aufgerufen
export async function getStaticPaths() {
return {
// Nur `/posts/1` und `/posts/2` werden zur Build-Zeit generiert
paths: [{ params: { id: '1' } }, { params: { id: '2' } }],
// Ermöglicht die statische Generierung zusätzlicher Seiten
// Zum Beispiel: `/posts/3`
fallback: true,
}
}
// Wird auch zur Build-Zeit aufgerufen
export async function getStaticProps({ params }) {
// params enthält die Beitrags-ID.
// Wenn die Route z.B. /posts/1 ist, dann ist params.id 1
const res = await fetch(`https://.../posts/${params.id}`)
const post = await res.json()
// Beitragsdaten via Props an die Seite übergeben
return {
props: { post },
// Beitrag höchstens einmal pro Sekunde regenerieren,
// wenn eine Anfrage eingeht
revalidate: 1,
}
}
export default Post
Versionsverlauf
Version | Änderungen |
---|---|
v13.4.0 | App Router ist jetzt stabil mit vereinfachtem Data Fetching, einschließlich generateStaticParams() |
v12.2.0 | On-Demand Inkrementelle Statische Regenerierung ist stabil. |
v12.1.0 | On-Demand Inkrementelle Statische Regenerierung hinzugefügt (beta). |
v9.5.0 | Stabile Inkrementelle Statische Regenerierung |
v9.3.0 | getStaticPaths eingeführt. |