Como ofuscar código JavaScript

Cole código JavaScript e a ferramenta devolve o mesmo programa com os nomes locais trocados, as strings escritas como escapes \xNN e \uNNNN, o acesso com ponto convertido em colchetes e os comentários removidos. O código continua rodando com o mesmo resultado; tudo é processado nesta aba e nada é enviado.

É ofuscação para dificultar a leitura casual, não criptografia. A lógica continua ali, então não conte com ela para esconder chaves de API ou regras de negócio, e guarde o original legível: depurar a saída na mão é desconfortável.

  1. Cole ou digite o script na área de texto; a versão ofuscada substitui a saída anterior. Clique em Ofuscar JavaScript ou use Ctrl/⌘+Enter depois de cada edição.
  2. Use Copiar para levar o resultado e Limpar para esvaziar os dois painéis antes do próximo script.
  3. Antes de publicar a saída, rode-a contra uma amostra pequena com resultado conhecido; a transformação preserva o comportamento e a checagem leva um minuto.
  4. Mantenha o arquivo original. A cópia ofuscada é para distribuição; o código legível é o que você continua editando.

O que o ofuscador muda e do que ele não protege

O que o ofuscador muda

Os comentários são removidos, mas as quebras de linha ficam, então apagar uma nota // nunca engole a linha seguinte. Identificadores declarados dentro do trecho — variáveis, funções, parâmetros, classes, capturas de catch — são renomeados para nomes curtos gerados seguindo a cadeia de escopos; nomes que vêm de fora, incluindo globais, permanecem iguais.

As strings são reescritas caractere a caractere como escapes \xNN ou \uNNNN, e a diretiva "use strict" fica como está. O acesso com ponto vira colchetes: console.log passa a console["\x6c\x6f\x67"], e o encadeamento opcional segue a mesma regra (a?.b passa a a?.["b"]). Depois de new e import a sintaxe não é tocada, e campos #privados ficam intactos.

O que ele não é

Não é criptografia nem minificação. As strings ofuscadas ficam maiores, não menores, e um leitor determinado ainda consegue acompanhar a lógica — o objetivo é desencorajar cópia e leitura rápida, não tornar a reversão impossível.

É uma passada única sobre o código, não um empacotador: não resolve importações, não transpila sintaxe moderna e não muda como o arquivo é carregado. Colar o mesmo script duas vezes gera saídas diferentes, porque os nomes gerados dependem do conteúdo; bom para distribuir, ruim para comparar builds.

Comportamento testado

A saída é testada para devolver os mesmos valores da entrada: classes, arrow functions, templates com expressões ${} aninhadas, async/await, spread, encadeamento opcional, coalescência nula e literais de regex passam nos testes. Código de módulo mantém os nomes de import e export, então continua carregando como módulo.

Scripts que usam eval ou with não são renomeados — pular o renome é a única opção segura ali —, mas o escapamento e a conversão para colchetes continuam valendo. Um arquivo de cerca de 80 KB é processado em poucas dezenas de milissegundos; um script já ofuscado pode ser ofuscado de novo.

Ferramentas recentes: