DevGustavo

Back to Blog

100/100 no Lighthouse: A Jornada para um Blog Perfeito

Pouco menos de uma semana depois de colocar as principais funcionalidades do meu novo blog no ar, decidi fazer uma pausa estratégica. Era hora de testar, verificar requisições, analisar cada detalhe e garantir que não havia nenhum ponto cego antes de migrar definitivamente o domínio. Durante esse período, aproveitei para adicionar algumas melhorias importantes: um formulário de contato integrado com Formspree (que direciona as mensagens direto para meu email pessoal), correção de links no footer e navbar, e outros ajustes finos que fazem toda a diferença na experiência do usuário.

5 min read
0 comments
100/100 no Lighthouse: A Jornada para um Blog Perfeito

O Desafio do Lighthouse Se você leu meu último post, sabe que eu estava na luta pelos últimos 8 pontos do SEO para alcançar a pontuação máxima. Mas não era só isso — os outros índices ainda deixavam a desejar. Performance, Acessibilidade e Best Practices precisavam de atenção. A meta era clara: 100/100 em todos os critérios.

──────────────────────────────────────────────────────────────

A Jornada Técnica

Performance & SEO ✅

A questão do SEO foi superada! Em relação à performance, implementei:

1- Lazy loading nos componentes e hooks

2- Code splitting otimizado

3- Build de produção completamente otimizado com Next.js 15

──────────────────────────────────────────────────────────────

Entendendo as Otimizações de Performance

1- Lazy Loading: Carregue apenas o necessário

O problema era simples: por que carregar TODOS os 12 cards de projetos se o usuário ainda está vendo a introdução? Por que trazer a seção de newsletter antes dela aparecer na tela?

Como implementei: Utilizei o React.lazy() combinado com dynamic imports do Next.js para componentes pesados:

// Componente carregado apenas quando necessário const Newsletter = dynamic(() => import('@/components/Newsletter'), { loading: () => <div>Carregando...</div> })

Para as imagens, o Next.js já faz lazy loading automaticamente com o componente Image, mas configurei o loading="lazy" explicitamente e usei priority={false} para imagens abaixo da dobra.

Por que funciona:

1- Reduz o JavaScript bundle inicial em ~40%

2- Melhora o Time to Interactive (TTI)

3- Carrega recursos apenas quando o usuário vai vê-los

4- Browser usa menos memória

──────────────────────────────────────────────────────────────

2- Code Splitting: Divida para Conquistar

Code splitting significa dividir seu código JavaScript em pedaços menores (chunks) em vez de um único arquivo gigante.

Como o Next.js faz automaticamente:

O Next.js já faz code splitting por rota (cada página é um chunk separado), mas otimizei ainda mais criando rotas dinâmicas para os posts do blog:

// app/blogs/[slug]/page.tsx // Cada post é carregado sob demanda

E separei bibliotecas pesadas em chunks independentes. Por exemplo, o editor de posts (que só admin usa) não é carregado para visitantes normais.

Como implementei manualmente:

// Carregar biblioteca pesada apenas quando necessário

const loadEditor = async () => {

const module = await import('react-markdown')

return module

}

Por que funciona:

1- Visitantes carregam apenas o código da página que estão vendo

2- Bibliotecas pesadas não bloqueiam o carregamento inicial

3- First Contentful Paint (FCP) melhora drasticamente

4- Cada rota tem seu próprio bundle otimizado

──────────────────────────────────────────────────────────────

3. Build de Produção: Otimização Máxima

Durante o desenvolvimento, usamos npm run dev, mas para produção, o npm run build faz mágica.

O que o build de produção faz:

Minificação: Remove espaços, comentários e reduz nomes de variáveis

// Desenvolvimento function calculateTotalPrice(items) { return items.reduce((total, item) => total + item.price, 0) }

// Produção (minificado) function c(i){return i.reduce((t,i)=>t+i.p,0)}

Tree Shaking: Remove código não utilizado Se você importa apenas useState do React, não traz o React inteiro!

Static Site Generation (SSG): Páginas são geradas em build time

// next.config.js output: 'export' // Gera HTML estático

Meu blog usa SSG para páginas estáticas e ISR (Incremental Static Regeneration) para posts que mudam: export const revalidate = 3600 // Revalida a cada 1 hora

Por que funciona:

1- JavaScript 70% menor (minificado + tree shaking)

2- Imagens até 80% menores (WebP vs PNG)

3- Tempo de carregamento reduzido drasticamente

4- SEO melhor (páginas pré-renderizadas)

──────────────────────────────────────────────────────────────

Acessibilidade: O Último Obstáculo 🎯

Accessibility estava em 85 pontos. O Lighthouse apontava problemas simples, mas cruciais:

Image

Os problemas identificados:

❌ Faltava aria-label no botão do menu mobile

❌ Links para GitHub e LinkedIn sem labels descritivos

❌ Contraste de cor inadequado na seção Newsletter

As Correções:

// Antes

<button> <MenuIcon /> </button>

// Depois

<button aria-label="Abrir menu de navegação"> <MenuIcon /> </button>

E ajustes no contraste de cores da Newsletter para cumprir os padrões WCAG. Alterações feitas e... VOILÀ!

Image

──────────────────────────────────────────────────────────────

🎊 A Surpresa do Lighthouse

Não sabia que quando você atinge 100 pontos em todos os critérios, o Lighthouse solta confetes pela tela como uma verdadeira celebração! 🎉

Foi um momento especial. Pode parecer besteira, mas me senti genuinamente recompensado. É a ferramenta reconhecendo o esforço e atenção aos detalhes. 😊

──────────────────────────────────────────────────────────────

Migração: AWS Amplify → Vercel

Com a confiança de ter um site perfeitamente otimizado, chegou a hora da migração completa.

Setup anterior: AWS Amplify Setup atual: Vercel Por que a mudança?

O deploy já estava funcionando perfeitamente no Vercel Bastava redirecionar o DNS do Route 53 Processo simples, prático e rápido

A migração foi suave — em menos de 10 minutos, tudo estava rodando no novo ambiente com SSL ativo e performance impecável.

──────────────────────────────────────────────────────────────

Reflexões Finais

Estou muito animado com esse projeto! Além de todo o aprendizado técnico que a construção deste blog me proporcionou, ter esse cantinho para escrever o que eu quiser é libertador. Mas o mais importante: escrever sobre o processo me ajuda a:

1- Reforçar o aprendizado— escrever ainda é a melhor forma de aprender

2- Documentar a jornada— revisitar decisões técnicas

3- Ajudar outras pessoas— se alguém enfrentar os mesmos desafios, já tem um guia

Se você está construindo seu portfolio ou blog, minha dica é: não se contente com "funciona". Invista tempo em acessibilidade, performance e SEO. A diferença é notável e seu trabalho se destaca.

──────────────────────────────────────────────────────────────

Tech Stack

Framework: Next.js 15 + TypeScript

Styling: Tailwind CSS

Hosting: Vercel

CMS: Sistema próprio de blog com CRUD

Forms: Formspree

Analytics: Preparado para integração

E você, já testou seu site no Lighthouse? Compartilha os resultados nos comentários! 👇

#WebDevelopment #NextJS #Frontend #Lighthouse #WebPerformance #Accessibility #SEO #TypeScript #TailwindCSS #Vercel #DevJourney

Comments (0)

Share your thoughts about this article

Leave a Comment

Leave a Comment

No comments yet. Be the first to share your thoughts!