Voltar para Postagens

Criação de Posts com MDX

Érico Marshall , 3 de setembro de 2024

Ao criar meu site, queria uma forma de escrever posts com conteúdo dinâmico e de fácil formatação. Para isso, descobri o conteúdo do Hamed Bahram sobre como aplicar MDX em um site Next.js.

O que é MDX?

MDX é uma ferramenta que permite escrever markdown com JSX. Isso permite que você escreva componentes React dentro do seu markdown. Isso é muito útil para criar posts com conteúdo dinâmico em um blog, por exemplo.

export function HelloWorld() {
  return <h1>Hello, World!</h1>
}

Como usar MDX?

Biblioteca

Para usar MDX, você precisa de um compilador que transforme o seu markdown com JSX em um arquivo JavaScript. Como esse site foi desenvolvido em NextJS, estamos utilizando a biblioteca next-mdx-remote.

Aplicação

const content = `
## Escrita em Markdown
`
return (
  <div>
    <MDXRemote source={content} />
  </div>
)

Porém, dessa forma os code-snippets não terão syntax highlight. Para isso, foi utilizada a biblioteca sugar-high.

Criamos uma função que recebe o conteúdo em markdown, detecta o que há dentro de code-snippets e aplica o syntax highlight.

function Code({ children, ...props }: any) {
  let codeHTML = highlight(children)
  return <code dangerouslySetInnerHTML={{ __html: codeHTML }} {...props} />
}

const components = {
  code: Code
}

export default function MDXContent(
  props: JSX.IntrinsicAttributes & MDXRemoteProps
) {
  return (
    <MDXRemote
      {...props}
      components={{ ...components, ...(props.components || {}) }}
    />
  )
}

Assim, envolvemos nosso markdwon dentro do componente MDXContent e ele irá aplicar o syntax highlight nos code-snippets.

  <div>
    <MDXContent source={content} />
  </div>

Estilização

Para estilizar o conteúdo do markdown, utilizamos um plugin do TailwindCSS chamado Typography. Já para os code-snippets, foi adicionado ao globals.css as variáveis de cor que o sugar-high utiliza.

Conclusão

Com o MDX, é possível criar posts com conteúdo dinâmico e de fácil formatação. Além disso, é possível adicionar code-snippets estilizados dentro do markdown, o que torna a escrita de posts mais flexível e poderosa.