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:
Uma verificação rápida no bundle confirma que o mesmo identificador é declarado em mais de um chunk:
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 arquivoPasse 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
identifierNamesGeneratorparahexadecimalOs 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
randomIdentifiersPrefix— prefixo aleatório por build (recomendado)identifiersPrefix— string de prefixo explícitaidentifierNamesGenerator— formato do nome (mangled,hexadecimal, …)
