Skip to content

fix: plugin de purge renomeia o CSS pelo conteúdo purgado - #8

Merged
rhengles merged 1 commit into
mainfrom
ccr-1c803726-77eafc
Oct 18, 2026
Merged

rhengles merged 1 commit into
mainfrom
ccr-1c803726-77eafc

Conversation

@rhengles

Copy link
Copy Markdown
Member

Problema

bootswatchPurge (vite/index.mjs) enxuga cada CSS de tema no generateBundle, quando o Vite já deu o hash do nome pelo CSS inteiro do tema — que vem do pacote e não muda. Quando o app passa a usar uma classe nova, o conteúdo purgado muda e o nome não, e o navegador segue com a cópia antiga em cache.

Caso real (ddsoft-online, docs/changelog/2026-10-17-css-tema-cache.md): bootstrap-CqnRIIsZ.css saiu em 20/09 sem a regra de textBgInfo e em 17/10 com ela; o selo GHS ficou sem fundo e com o texto branco do badge. O ddsoft contornou com um plugin local e deixou a pendência: "a correção certa é no plugin de purge do pacote: renomear o asset depois de purgar".

O que mudou

  • generateBundle passa a order: 'post', para rodar depois de o Vite escrever os nomes dos CSS nos chunks (__vite__mapDeps) e no index.html.
  • Cada CSS que o purge altera ganha no nome o hash do conteúdo final (SHA-256, base64url, 8 caracteres). O asset é emitido com this.emitFile (o Rolldown recusa entrada nova atribuída ao bundle), mantendo name/originalFileName.
  • O nome antigo é trocado no código dos chunks, no viteMetadata.importedCss (manifest) e nos assets .html.
  • CSS que o purge não altera, ou sem hash no nome, fica com o nome do Vite.
  • Changelog em docs/changelog/2026-10-18-purge-nome-pelo-conteudo.md.

Sem mudança de API. Um consumidor com o contorno local (o ddsoft:css-tema-pelo-conteudo) continua funcionando: os nomes já batem com o conteúdo e ele não troca nada.

Como foi testado

No ddsoft-online/frontend (Vite 8 / Rolldown), com o plugin de contorno local desligado:

  • vite/index.js publicado na 0.2.1: npm run test:build falha — "bootstrap-CqnRIIsZ.css não tem o hash do conteúdo (7iFlItaN)".
  • Com este vite/index.mjs: passa ("4 CSS de tema com nome pelo conteúdo"). Os 29 CSS de dist/assets têm o hash do próprio conteúdo, todos são referenciados por um chunk JS ou pelo index.html, e nenhum nome antigo sobrou.

O repo não tem testes automatizados para o plugin, e o biome.json ignora vite/.

Depois do merge

Publicar como 0.2.2. No ddsoft-online, subir a dependência e remover o ddsoft:css-tema-pelo-conteudo do vite.config.ts (a trava do check-build.mjs fica).


Generated by Claude Code

O purge muda o CSS depois de o Vite dar nome ao arquivo pelo CSS inteiro do
tema, que não muda. Uma classe nova no app saía com o mesmo nome e o navegador
seguia com a cópia antiga em cache. Agora o generateBundle roda em 'post', o
asset purgado ganha o hash do conteúdo final e as referências nos chunks JS,
no importedCss e no HTML acompanham.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Pey5PfKcEbwK7SUkH4mhHK
@rhengles
rhengles merged commit d27871d into main Oct 18, 2026
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant