eovinicius

Notas · · 2 min de leitura

Como este site funciona

HTML, CSS e JavaScript puros, um build curto e uma CSP sem 'unsafe-inline'. As decisões por trás do eovinicius.dev.

Este site não usa framework. São arquivos HTML, CSS e JavaScript que rodam direto no navegador, mais um script de build pequeno que só existe para o deploy. Aqui estão as peças e como elas se encaixam.

O código-fonte roda sem build

Em desenvolvimento, npm run dev sobe um servidor em Node que monta cada página a cada requisição. Não tem bundler nem cache: salvo o arquivo e recarrego a página. Os scripts são clássicos, carregados com defer numa ordem fixa, e os de dados (config.js, dev-content.js, i18n.js) só declaram uma constante global.

Essa escolha tem um efeito útil: o mesmo arquivo de dados serve ao navegador e ao Node. O build lê o dev-content.js com node:vm e escreve a página Dev em HTML simples, para buscadores e prévias de link que não executam JavaScript. Quando o script carrega, ele troca essa versão pela interativa.

O build só otimiza

O build.mjs faz poucas coisas:

  • junta os arquivos CSS num <style> inline e minificado, para nada bloquear a renderização;
  • minifica cada script com esbuild e põe um hash no nome, o que permite cache imutável de um ano;
  • minifica o HTML;
  • monta a versão em inglês a partir do mesmo index.html;
  • transforma as notas em Markdown, como esta, em páginas;
  • calcula a Content Security Policy.

Uma CSP sem unsafe-inline

Depois da minificação, o build calcula o SHA-256 de cada <script> e <style> inline e põe esses hashes numa CSP dentro de uma tag <meta>. Qualquer outro script inline é bloqueado pelo navegador.

O preço é uma regra que precisa ser lembrada: nada de atributo style no HTML nem em strings de innerHTML. Quando preciso de uma variável CSS por elemento, uso el.style.setProperty() no JavaScript, que a CSP permite.

Dois idiomas, um HTML

A versão em inglês não é outro arquivo. Uma lista de pares, com o texto em português e o texto em inglês, é aplicada ao index.html no build. Se um trecho da lista não for encontrado, o build falha em vez de publicar uma página meio traduzida.

Testes que pegam o que importa

Os testes são de fumaça, com Playwright, contra o build de produção, num desktop e num celular emulado. Eles conferem que as páginas abrem nos dois idiomas, que o terminal responde, que o HTML sem JavaScript tem o conteúdo e que nenhum erro aparece no console. Esse último cobre a CSP: se algo for bloqueado, o teste falha.

No CI, o Lighthouse exige nota mínima de 90 em performance e boas práticas, e de 95 em acessibilidade e SEO.

O que fica de lição

Começar sem framework e só acrescentar ferramenta quando um problema aparece. Fazer o build falhar alto quando uma suposição quebra. E testar o artefato que vai para produção, não o ambiente de desenvolvimento.