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.