Next.js + Styled Components, guia simples

November 28, 2019

Next.js + Styled Components

Olá,

Neste post irei detalhar como utilizar o Next.js com o Styled Components, basicamente você irá trabalhar com 3 arquivos _document, _app e .babelrc.

Se quiser ver a configuração funcionando:

Considerando que você já está utilizando o Next.js e possui ele instalado, rode um dos seguintes comandos em seu projeto para adicionar o styled-components:

  npm i styled-components
  ----- ou ------
  yarn add styled-components

E precisaremos do pacote babel-plugin-styled-components para rodarmos o Styled Components no servidor (SSR)

  npm i babel-plugin-styled-components -D
  ----- ou -----
  yarn add babel-plugin-styled-components -D

Dentro de sua pasta ‘pages’ que faz parte da criação do Next.js para construção de página crie 2 arquivos _document.js e _app.js, eles são utilizados normalmente para injetar e configurar dependências globais dentro do Next.js.

Dentro de seu _document.js aplique o código:

  import Document 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()
      }
    }
  }

E em seu _app.js:

  import App from 'next/app'
  
  export default class MyApp extends App {
    render() {
      const { Component, pageProps } = this.props
      return <Component {...pageProps} />
    }
  }

Agora no arquivo .babelrc (caso não exista, crie ele) na raiz de seu projeto adicione a configuração informando que deseja usar o Styled Components com SSR:

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

Essa é a configuração básica inicial para ter o Styled Components junto com o Next.js, você pode extender outras configurações do plugin babel ou adicionar mais elementos em seu _app ou _document, como um Theme Provider por exemplo.