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
_documentest uniquement rendu côté serveur, donc les gestionnaires d'événements commeonClickne 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_documentn'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/headdans 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. Documentne prend actuellement pas en charge les méthodes de récupération de données (Data Fetching) de Next.js commegetStaticPropsougetServerSideProps.
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 MyDocumentimport 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 MyDocumentBon à savoir
getInitialPropsdans_documentn'est pas appelé lors des transitions côté client.- L'objet
ctxpour_documentest équivalent à celui reçu dansgetInitialProps, avec l'ajout derenderPage.