Vincent Barrault

Faire du CSS-in-JS avec styled-component dans NextJS

Faire du CSS-in-JS avec styled-component dans NextJS

Table des matières

Installation

Nous allons commencer par ajouter styled-component à notre projet NextJs en exécutant les commandes suivantes:

yarn add styled-components
yarn add @types/styled-components babel-plugin-styled-components --dev

Ensuite, nous allons créer un fichier de configuration pour babel

./babelrc
{ 
    "presets": ["next/babel"], 
    "plugins": [
        ["styled-components", { "ssr": true }]
    ]
}

Modifier le _document.tsx

Si le fichier ./pages/_document.tsx n'est pas encore présent dans notre projet, nous allons commencer par l'ajouter.

./pages/_document.tsx
import Document, { Head, Html, Main, NextScript } from 'next/document'
import { ServerStyleSheet } from 'styled-components'

export default class MyDocument extends Document {
    static async getInitialProps(ctx) {
        const sheet = new ServerStyleSheet()
        const originalRenderPage = ctx.renderPage

        try {
            ctx.renderPage = () =>
                originalRenderPage({
                    enhanceApp: (App) => (props) =>
                        sheet.collectStyles(<App {...props} />),
                })

            const initialProps = await Document.getInitialProps(ctx)
            return {
                ...initialProps,
                styles: (
                    <>
                        {initialProps.styles}
                        {sheet.getStyleElement()}
                    </>
                ),
            }
        } finally {
            sheet.seal()
        }
    }

    render() {
        return (
            <Html lang="fr">
                <Head />
                <body>
                    <Main />
                    <NextScript />
                </body>
            </Html>
        )
    }
}

Utilisation dans un composant

Une fois installé, nous pouvons utiliser styled-components dans nos composants comme ceci:

./components/my-component.tsx
import styled from 'styled-components'

export const MyElement = styled.div`
    color: red;
`;

export function MyComponent() {
    return (
        <MyElement>
            This is a test component...
        </MyElement>
    )
}