Optimisation statique automatique
Next.js détermine automatiquement qu'une page est statique (peut être prérendue) si elle n'a pas de besoins en données bloquantes. Cette détermination se fait par l'absence de getServerSideProps
et getInitialProps
dans la page.
Cette fonctionnalité permet à Next.js de produire des applications hybrides qui contiennent à la fois des pages rendues côté serveur et générées statiquement.
Bon à savoir : Les pages générées statiquement restent réactives. Next.js hydratera votre application côté client pour lui donner une interactivité complète.
L'un des principaux avantages de cette fonctionnalité est que les pages optimisées ne nécessitent aucun calcul côté serveur et peuvent être instantanément diffusées à l'utilisateur final depuis plusieurs emplacements CDN. Le résultat est une expérience de chargement ultra rapide pour vos utilisateurs.
Comment cela fonctionne
Si getServerSideProps
ou getInitialProps
est présent dans une page, Next.js basculera vers un rendu à la demande, par requête (ce qui signifie Rendu côté serveur (Server-Side Rendering)).
Si ce n'est pas le cas, Next.js optimisera statiquement votre page automatiquement en prérendant la page en HTML statique.
Lors du prérendu, l'objet query
du routeur sera vide car nous n'avons pas d'informations de query
à fournir pendant cette phase. Après l'hydratation, Next.js déclenchera une mise à jour de votre application pour fournir les paramètres de route dans l'objet query
.
Les cas où la query
sera mise à jour après l'hydratation, déclenchant un autre rendu, sont :
- La page est une route dynamique (dynamic-route).
- La page a des valeurs de
query
dans l'URL. - Des rewrites sont configurés dans votre
next.config.js
car ceux-ci peuvent avoir des paramètres qui doivent être analysés et fournis dans laquery
.
Pour pouvoir distinguer si la query
est entièrement mise à jour et prête à l'emploi, vous pouvez utiliser le champ isReady
de next/router
.
Bon à savoir : Les paramètres ajoutés avec des routes dynamiques (dynamic routes) à une page utilisant
getStaticProps
seront toujours disponibles dans l'objetquery
.
next build
produira des fichiers .html
pour les pages optimisées statiquement. Par exemple, le résultat pour la page pages/about.js
serait :
Et si vous ajoutez getServerSideProps
à la page, elle sera alors en JavaScript, comme ceci :
Mises en garde
- Si vous avez une App personnalisée (custom
App
) avecgetInitialProps
, alors cette optimisation sera désactivée pour les pages sans Génération statique (Static Generation). - Si vous avez un Document personnalisé (custom
Document
) avecgetInitialProps
, assurez-vous de vérifier sictx.req
est défini avant de supposer que la page est rendue côté serveur.ctx.req
seraundefined
pour les pages prérendues. - Évitez d'utiliser la valeur
asPath
denext/router
dans l'arbre de rendu tant que le champisReady
du routeur n'est pastrue
. Les pages optimisées statiquement ne connaissentasPath
que côté client et non côté serveur, donc l'utiliser comme prop peut entraîner des erreurs de non-correspondance. L'exempleactive-class-name
montre une façon d'utiliserasPath
comme prop.