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 le 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 une fonctionnalité avancée, principalement nécessaire pour les bibliothèques comme CSS-in-JS afin de prendre en charge 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 par 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 par 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
.