getStaticPaths
Lorsque vous exportez une fonction appelée getStaticPaths
depuis une page utilisant des routes dynamiques, Next.js pré-rendra statiquement tous les chemins spécifiés par getStaticPaths
.
Valeurs de retour de getStaticPaths
La fonction getStaticPaths
doit retourner un objet avec les propriétés requises suivantes :
paths
La clé paths
détermine quels chemins seront pré-rendus. Par exemple, supposons que vous ayez une page utilisant des routes dynamiques nommée pages/posts/[id].js
. Si vous exportez getStaticPaths
depuis cette page et retournez ce qui suit pour paths
:
Ensuite, Next.js générera statiquement /posts/1
et /posts/2
pendant next build
en utilisant le composant de page dans pages/posts/[id].js
.
La valeur de chaque objet params
doit correspondre aux paramètres utilisés dans le nom de la page :
- Si le nom de la page est
pages/posts/[postId]/[commentId]
, alorsparams
doit contenirpostId
etcommentId
. - Si la page utilise des routes catch-all comme
pages/[...slug]
, alorsparams
doit contenirslug
(qui est un tableau). Si ce tableau est['hello', 'world']
, alors Next.js générera statiquement la page à/hello/world
. - Si la page utilise une route catch-all optionnelle, utilisez
null
,[]
,undefined
oufalse
pour rendre la route racine. Par exemple, si vous fournissezslug: false
pourpages/[[...slug]]
, Next.js générera statiquement la page/
.
Les chaînes params
sont sensibles à la casse et idéalement devraient être normalisées pour garantir que les chemins sont générés correctement. Par exemple, si WoRLD
est retourné pour un paramètre, cela ne correspondra que si WoRLD
est le chemin réellement visité, pas world
ou World
.
Séparément de l'objet params
, un champ locale
peut être retourné lorsque i18n est configuré, ce qui configure la locale pour le chemin généré.
fallback: false
Si fallback
est false
, tout chemin non retourné par getStaticPaths
résultera en une page 404.
Lorsque next build
est exécuté, Next.js vérifiera si getStaticPaths
a retourné fallback: false
, puis construira uniquement les chemins retournés par getStaticPaths
. Cette option est utile si vous avez un petit nombre de chemins à créer ou si les données de nouvelles pages ne sont pas ajoutées souvent. Si vous devez ajouter plus de chemins et que vous avez fallback: false
, vous devrez exécuter next build
à nouveau pour que les nouveaux chemins puissent être générés.
L'exemple suivant pré-rend un article de blog par page appelé pages/posts/[id].js
. La liste des articles de blog sera récupérée depuis un CMS et retournée par getStaticPaths
. Ensuite, pour chaque page, il récupère les données de l'article depuis un CMS en utilisant getStaticProps
.
fallback: true
Si fallback
est true
, le comportement de getStaticProps
change de la manière suivante :
- Les chemins retournés par
getStaticPaths
seront rendus enHTML
au moment de la construction pargetStaticProps
. - Les chemins qui n'ont pas été générés au moment de la construction ne renverront pas une page 404. À la place, Next.js servira une version de « fallback » de la page lors de la première requête vers ce chemin. Les robots d'indexation, comme Google, ne recevront pas de fallback et le chemin se comportera comme avec
fallback: 'blocking'
. - Lorsqu'une page avec
fallback: true
est atteinte vianext/link
ounext/router
(côté client), Next.js ne servira pas de fallback et la page se comportera comme avecfallback: 'blocking'
. - En arrière-plan, Next.js générera statiquement le
HTML
etJSON
du chemin demandé. Cela inclut l'exécution degetStaticProps
. - Une fois terminé, le navigateur recevra le
JSON
pour le chemin généré. Ceci sera utilisé pour rendre automatiquement la page avec les props requises. Du point de vue de l'utilisateur, la page passera de la page de fallback à la page complète. - En même temps, Next.js ajoute ce chemin à la liste des pages pré-rendues. Les requêtes suivantes vers le même chemin serviront la page générée, comme les autres pages pré-rendues au moment de la construction.
Bon à savoir :
fallback: true
n'est pas supporté lors de l'utilisation deoutput: 'export'
.
Quand fallback: true
est-il utile ?
fallback: true
est utile si votre application a un très grand nombre de pages statiques dépendant de données (comme un très grand site e-commerce). Si vous voulez pré-rendre toutes les pages de produits, les constructions prendraient très longtemps.
À la place, vous pouvez générer statiquement un petit sous-ensemble de pages et utiliser fallback: true
pour le reste. Lorsque quelqu'un demande une page qui n'a pas encore été générée, l'utilisateur verra la page avec un indicateur de chargement ou un composant squelette.
Peu après, getStaticProps
se termine et la page sera rendue avec les données demandées. Désormais, toute personne demandant la même page recevra la page pré-rendue statiquement.
Cela garantit que les utilisateurs ont toujours une expérience rapide tout en préservant des constructions rapides et les bénéfices de la génération statique.
fallback: true
ne mettra pas à jour les pages générées, pour cela, consultez la régénération statique incrémentielle.
fallback: 'blocking'
Si fallback
est 'blocking'
, les nouveaux chemins non retournés par getStaticPaths
attendront que le HTML
soit généré, identique au SSR (d'où le terme blocking), puis seront mis en cache pour les requêtes futures afin que cela n'arrive qu'une fois par chemin.
getStaticProps
se comportera comme suit :
- Les chemins retournés par
getStaticPaths
seront rendus enHTML
au moment de la construction pargetStaticProps
. - Les chemins qui n'ont pas été générés au moment de la construction ne renverront pas une page 404. À la place, Next.js fera du SSR lors de la première requête et retournera le
HTML
généré. - Une fois terminé, le navigateur recevra le
HTML
pour le chemin généré. Du point de vue de l'utilisateur, cela passera de "le navigateur demande la page" à "la page entière est chargée". Il n'y a pas d'affichage flash d'état de chargement/fallback. - En même temps, Next.js ajoute ce chemin à la liste des pages pré-rendues. Les requêtes suivantes vers le même chemin serviront la page générée, comme les autres pages pré-rendues au moment de la construction.
fallback: 'blocking'
ne mettra pas à jour les pages générées par défaut. Pour mettre à jour les pages générées, utilisez la régénération statique incrémentielle conjointement avec fallback: 'blocking'
.
Bon à savoir :
fallback: 'blocking'
n'est pas supporté lors de l'utilisation deoutput: 'export'
.
Pages de fallback
Dans la version "fallback" d'une page :
- Les props de la page seront vides.
- En utilisant le routeur, vous pouvez détecter si le fallback est en cours de rendu,
router.isFallback
seratrue
.
L'exemple suivant montre l'utilisation de isFallback
:
Historique des versions
Version | Changements |
---|---|
v13.4.0 | App Router est maintenant stable avec une récupération de données simplifiée, incluant generateStaticParams() |
v12.2.0 | Régénération statique incrémentielle à la demande est stable. |
v12.1.0 | Régénération statique incrémentielle à la demande ajoutée (bêta). |
v9.5.0 | Régénération statique incrémentielle stable |
v9.3.0 | getStaticPaths introduit. |