Minificador
A minificação de JavaScript é central para o desempenho de sites: reduz o volume de dados enviado ao usuário e tende a acelerar o carregamento das páginas. Isso tem valor econômico enorme, principalmente em e-commerce, onde cada segundo pode significar milhões.
Porém os minificadores atuais costumam exigir troca entre qualidade de compressão e velocidade. Ou você usa o mais lento para máxima compressão, ou o mais rápido para menos compressão. E se desse para ter um minificador mais rápido sem abrir mão da compressão?
Objetivos do projeto
Estamos trabalhando num protótipo que busca exatamente isso, portando todos os casos de teste de minificadores conhecidos como google-closure-compiler, terser, esbuild e tdewolff-minify.
Resultados preliminares indicam que estamos no caminho certo. Com o minificador Oxc, esperamos tempos de minificação menores sem sacrificar a qualidade da compressão.
Desempenho alvo
- Velocidade: mais rápido que o Terser, competitivo com o esbuild
- Compressão: igualar ou superar a taxa de compressão do Terser
- Corretude: passar nas principais suítes de teste de minificadores
Visão geral da arquitetura
Princípios de desenho
O minificador Oxc se apoia em alguns princípios:
- Consciente da semântica: usa análise semântica para otimizações seguras
- Incremental: pensado para fluxos de compilação incremental
- Configurável: suporta vários níveis de otimização e alvos
- Correto: prioriza correção em vez de otimização agressiva demais
Estado atual
Funcionalidades implementadas
- ✅ Eliminação de código morto: remove código inatingível
- ✅ Dobra de constantes: avalia expressões constantes
- ✅ Tree shaking: remove exports não usados (básico)
- ✅ Fusão de variáveis: junta declarações de variável
- ✅ Fusão de statements: combina statements compatíveis
- ✅ Ofuscação de nomes: encurta nomes de variáveis e funções
- ✅ Otimização de fluxo de controle: simplifica estruturas de controle
- ✅ Inlining de funções: embute funções pequenas
- ✅ Tree shaking avançado: otimização entre módulos
Otimização de desempenho
Estratégias principais:
- Poucas passadas na AST: combinar várias otimizações numa única passagem quando dá
- Estruturas de dados eficientes: arena e representações compactas
- Encerramento antecipado: pular otimizações quando não há ganho
Recursos
Documentação
Referências externas
Playgrounds
- esbuild: https://esbuild.github.io/try
- rollup: https://rollupjs.org/repl
- swc: https://play.swc.rs
- terser: https://try.terser.org
- closure compiler: https://jscompressor.treblereel.dev
- O site oficial não está mais disponível: Closure Compiler Webservice Turndown - 2025