Documentação
/
Receitas
/

Evitando colisões de identificadores

Evitando colisões de identificadores entre arquivos ofuscados

Quando vários arquivos ofuscados por VM acabam no mesmo bundle, eles podem declarar o mesmo identificador de nível superior e quebrar a página no momento da análise. Veja por que isso acontece e como corrigir.

O sintoma

Seu build roda sem problemas, mas o navegador lança um erro no momento da análise, antes de o app iniciar:

browser console

Error

Uma verificação rápida no bundle confirma que o mesmo identificador é declarado em mais de um chunk:

terminal

Shell

Por que isso acontece

Por padrão, a ofuscação VM usa o gerador de nomes de identificadores mangled-shuffled. Ele percorre um alfabeto pequeno em uma ordem embaralhada determinística e adiciona um prefixo vm aos globais introduzidos pelo runtime. Os dois arquivos emitem identificadores a partir da mesma sequência embaralhada — então o primeiro global de cada arquivo compartilha um nome, o segundo compartilha outro, e assim por diante.

Cada arquivo é ofuscado de forma independente e o gerador reinicia do começo da sua sequência para cada um deles. Quando dois arquivos acabam no mesmo bundle, os nomes colidem. Duas declarações const vmd = … de nível superior caem no mesmo escopo e o parser rejeita a segunda.

Correções

Escolha uma das opções abaixo — a primeira é a correção recomendada:

  • Ative randomIdentifiersPrefix (recomendado)

    Cada execução de ofuscação recebe um prefixo aleatório único, adicionado a todo identificador gerado. Os nomes de arquivos diferentes deixam de compartilhar um namespace, então as colisões desaparecem sem que você precise coordenar prefixos manualmente.

  • Defina um identifiersPrefix único por arquivo

    Passe manualmente um prefixo diferente ao ofuscar cada arquivo (por exemplo, identifiersPrefix: 'auth_' para um, checkout_ para outro). É eficaz, mas propenso a erros se você tiver muitos arquivos — prefira a opção aleatória acima.

  • Troque o identifierNamesGenerator para hexadecimal

    Os nomes hexadecimais usam um espaço de chaves bem maior, então a chance de dois arquivos produzirem o mesmo identificador é praticamente nula. Contrapartida: os identificadores ficam mais longos do que os do mangled-shuffled, então o bundle fica um pouco maior.

  • Use um plugin de bundler ou a interface de lote com vários arquivos

    A maioria dos plugins oficiais de bundler (webpack, Rollup, Vite) cuida da unicidade dos prefixos automaticamente entre os arquivos de um build. A interface do obfuscator.io também cuida disso quando você usa a ofuscação em lote com vários arquivos. Se você estiver montando a ofuscação manualmente com a API npm, precisa optar pelo prefixo aleatório por conta própria.

Opções relacionadas