Document personnalisé
Un Document
personnalisé peut modifier les balises <html>
et <body>
utilisées pour rendre une Page.
Pour remplacer le Document
par défaut, créez le fichier pages/_document
comme indiqué ci-dessous :
import { Html, Head, Main, NextScript } from 'next/document'
export default function Document() {
return (
<Html lang="en">
<Head />
<body>
<Main />
<NextScript />
</body>
</Html>
)
}
import { Html, Head, Main, NextScript } from 'next/document'
export default function Document() {
return (
<Html lang="en">
<Head />
<body>
<Main />
<NextScript />
</body>
</Html>
)
}
Bon à savoir
_document
est uniquement rendu côté serveur, donc les gestionnaires d'événements commeonClick
ne peuvent pas être utilisés dans ce fichier.<Html>
,<Head />
,<Main />
et<NextScript />
sont nécessaires pour que la page soit correctement rendue.
Mises en garde
- Le composant
<Head />
utilisé dans_document
n'est pas le même quenext/head
. Le<Head />
utilisé ici doit uniquement contenir du code<head>
commun à toutes les pages. Pour tous les autres cas, comme les balises<title>
, nous recommandons d'utilisernext/head
dans vos pages ou composants. - Les composants React en dehors de
<Main />
ne seront pas initialisés par le navigateur. Ne rajoutez pas de logique applicative ici ou de CSS personnalisé (commestyled-jsx
). Si vous avez besoin de composants partagés sur toutes vos pages (comme un menu ou une barre d'outils), consultez plutôt Layouts. Document
ne prend actuellement pas en charge les méthodes de récupération de données (Data Fetching) de Next.js commegetStaticProps
ougetServerSideProps
.
Personnalisation de renderPage
La personnalisation de renderPage
est avancée et uniquement nécessaire pour des bibliothèques comme CSS-in-JS afin de supporter le rendu côté serveur. Ce n'est pas nécessaire pour la prise en charge intégrée de styled-jsx
.
Nous ne recommandons pas d'utiliser ce modèle. Envisagez plutôt d'adopter progressivement le routeur App, qui vous permet de récupérer plus facilement des données pour les pages et layouts.
import Document, {
Html,
Head,
Main,
NextScript,
DocumentContext,
DocumentInitialProps,
} from 'next/document'
class MyDocument extends Document {
static async getInitialProps(
ctx: DocumentContext
): Promise<DocumentInitialProps> {
const originalRenderPage = ctx.renderPage
// Exécute la logique de rendu React de manière synchrone
ctx.renderPage = () =>
originalRenderPage({
// Utile pour englober l'arbre React entier
enhanceApp: (App) => App,
// Utile pour englober à la page
enhanceComponent: (Component) => Component,
})
// Exécute le `getInitialProps` parent, qui inclut désormais le `renderPage` personnalisé
const initialProps = await Document.getInitialProps(ctx)
return initialProps
}
render() {
return (
<Html lang="en">
<Head />
<body>
<Main />
<NextScript />
</body>
</Html>
)
}
}
export default MyDocument
import Document, { Html, Head, Main, NextScript } from 'next/document'
class MyDocument extends Document {
static async getInitialProps(ctx) {
const originalRenderPage = ctx.renderPage
// Exécute la logique de rendu React de manière synchrone
ctx.renderPage = () =>
originalRenderPage({
// Utile pour englober l'arbre React entier
enhanceApp: (App) => App,
// Utile pour englober à la page
enhanceComponent: (Component) => Component,
})
// Exécute le `getInitialProps` parent, qui inclut désormais le `renderPage` personnalisé
const initialProps = await Document.getInitialProps(ctx)
return initialProps
}
render() {
return (
<Html lang="en">
<Head />
<body>
<Main />
<NextScript />
</body>
</Html>
)
}
}
export default MyDocument
Bon à savoir
getInitialProps
dans_document
n'est pas appelé lors des transitions côté client.- L'objet
ctx
pour_document
est équivalent à celui reçu dansgetInitialProps
, avec l'ajout derenderPage
.
Application personnalisée
Contrôlez l'initialisation des pages et ajoutez une mise en page persistante pour toutes les pages en remplaçant le composant App par défaut utilisé par Next.js.
Routes API
Next.js prend en charge les Routes API, vous permettant de construire votre API sans quitter votre application Next.js. Découvrez comment cela fonctionne ici.