Enquanto escrevia um post sobre Curvas de Bézier Dinâmicas (em breve nesse mesmo bat-canal), percebi que estava gastando mais tempo escrevendo o código do componente do post do que no próprio texto. Foi aí que me bateu a dúvida: "será que não existe uma forma melhor de integrar código e conteúdo?"
Depois de explorar algumas opções, decidi mudar tudo e construir meu blog usando MDX. No entanto, integrar essa abordagem à minha stack não foi tão simples quanto eu esperava. Passei por alguns desafios, quebrei a cabeça ajustando configurações, mas no fim, cheguei à versão do blog que você está lendo agora.
Neste artigo, vou compartilhar todo o processo de criação, desde a configuração inicial até os ajustes finais, para que você possa criar seu próprio blog com Next.js, MDX e Tailwind CSS sem as mesmas dores de cabeça. Mas antes: Por que MDX?
Se você já escreveu em Markdown, sabe o quanto ele facilita a vida. Com uma sintaxe simples e direta, dá para formatar texto sem precisar lidar com HTML ou editores visuais cheios de firulas. Mas e se desse para ir além e misturar Markdown com componentes React? Pois bem, jovem, é exatamente isso que o MDX faz.
O MDX (Markdown + JSX) permite escrever posts em Markdown e, ao mesmo tempo, utilizar componentes React dentro do conteúdo. Isso significa que, além de texto, listas e imagens, você pode inserir botões, gráficos dançantes, alertas pulsantes e qualquer outro componente React. Era exatamente essa flexibilidade que eu precisava para ilustrar melhor meus conceitos e tornar o blog mais envolvente.
Vamos começar criando nosso projeto com Next.js. Para isso, utilizaremos o @next/mdx, uma lib oficial do Next.js que facilita o suporte ao MDX.
No terminal, execute o comando abaixo:
E agora algumas dependências para o MDX:
Por que tantas dependências? (maldito JavaScript 😒)
O que é frontmatter e como o gray-matter funciona? 🤔
O Frontmatter é um bloco de metadados que fica no início de arquivos Markdown ou MDX, delimitado por três traços (---). Ele é usado para armazenar informações estruturadas sobre o documento, como título, data, autor e tags.
A biblioteca gray-matter separa esses metadados e os transforma em um objeto JavaScript. Exemplo de um arquivo .mdx:
Se processarmos esse arquivo com gray-matter, obteremos:
Coisa linda! 🤩
Agora que temos o projeto configurado, vamos integrar o MDX ao Next.js:
Mas o que exatamente esse código faz?
Agora com o projeto configurado, podemos começar a estruturar nosso blog. Vamos utilizar a seguinte arquitetura:
No Next.js, [slug] é uma rota dinâmica que permite gerar páginas automaticamente com base em um identificador único — neste caso, o nome do arquivo MDX. Em vez de criarmos uma página manualmente para cada post, o Next.js carrega e renderiza o conteúdo de forma dinâmica conforme a URL acessada.
Dentro do arquivo page.tsx da rota [slug], vamos criar um componente que captura o nome do arquivo MDX a partir da URL (por exemplo, /blog/post-exemplo), busca o arquivo correspondente (post-exemplo.mdx) e o exibe na tela.
O código ficará mais ou menos assim:
Com essa abordagem, sempre que adicionarmos um novo post em posts/, ele será automaticamente acessível via /blog/nome-do-post, sem precisar configurar nada manualmente!
Mas ainda temos um problema: como acessar os preciosos metadados dos nossos posts? Afinal, precisamos exibir informações essenciais, como o título, a data de publicação e qualquer outro dado relevante para melhorar a experiência do leitor.
Para organizar melhor nosso código, vamos criar um arquivo posts-helpers.ts dentro da pasta utils/. Esse arquivo conterá funções auxiliares para manipular os posts do blog, como listar posts e carregar o conteúdo de um post específico.
Maravilha! 🥳 Com nossas funções auxiliares criadas, podemos voltar à nossa página dinâmica [slug] e ajustá-la para carregar corretamente os posts do blog.
Agora que nossa página dinâmica [slug] está pronta, vamos configurar a listagem de posts para exibi-los na página principal do blog!
Todo blog que se preze precisa de uma página dedicada para listar seus posts, permitindo que os leitores naveguem e escolham o que desejam ler. Vamos criar essa listagem dentro da rota /blog e exibir os posts dinamicamente.
Para que o nosso querido Tailwind funcione corretamente dentro dos arquivos MDX, precisamos realizar algumas configurações essenciais.
As classes que estou utilizando são as que utilizo nesse blog que você está lendo. Mude, brinque e teste com outras variações para que seu blog fique com sua cara 🤓
Uma das grandes vantagens do MDX é a possibilidade de incluir componentes React dentro dos posts. Para que isso funcione corretamente no Next.js, precisamos configurar um arquivo especial chamado mdx-components.tsx, que define quais componentes estarão disponíveis dentro dos arquivos MDX.
Agora que registramos o componente, podemos utilizá-lo dentro de um post MDX:
Mas atenção: o Next.js consegue localizar os componentes apenas se eles estiverem dentro da pasta src/. Certifique-se de que a estrutura esteja organizada corretamente:
Eu gosto de separar os componentes que vou utilizar nos arquivos MDX na pasta widget/ ao inves da components, mas isso é preferencia minha. Você pode organizar como achar melhor.
Agora basta começar a criar seus mdx dentro da pasta post e ser feliz com seu novo blog com MDX + Next.js + Tailwind. Lembre-se que esse é somente um esqueleto para seu blog, o resto é com você!
Muito obrigado pela sua preciosa atenção. Até a próxima!