Éviter les collisions d'identifiants entre fichiers obfusqués
Lorsque plusieurs fichiers obfusqués par VM se retrouvent dans le même bundle, ils peuvent déclarer le même identifiant de niveau racine et faire planter la page dès l'analyse syntaxique. Voici pourquoi cela arrive et comment y remédier.
Le symptôme
Votre build se déroule sans erreur, mais le navigateur lève une exception à l'analyse syntaxique, avant même le démarrage de l'application :
Une vérification rapide sur l'ensemble du bundle confirme que le même identifiant est déclaré dans plusieurs chunks :
Pourquoi cela se produit
Par défaut, l'obfuscation VM utilise le générateur de noms d'identifiants mangled-shuffled. Il parcourt un petit alphabet dans un
ordre mélangé mais déterministe, et ajoute un préfixe vm aux globales introduites par le runtime. Les deux fichiers produisent donc des identifiants
issus de la même séquence mélangée — la première globale de chaque fichier porte le même nom, la deuxième un autre nom commun, et ainsi de suite.
Chaque fichier est obfusqué indépendamment et le générateur repart du début de sa séquence à chaque fois. Lorsque
deux fichiers atterrissent dans le même bundle, les noms entrent en collision. Deux déclarations const vmd = … de niveau racine se retrouvent dans la même
portée et l'analyseur syntaxique rejette la seconde.
Solutions
Choisissez l'une des approches suivantes — la première est la solution recommandée :
Activer
randomIdentifiersPrefix(recommandé)Chaque exécution d'obfuscation se voit attribuer un préfixe aléatoire unique, ajouté devant chaque identifiant généré. Les noms issus de fichiers différents ne partagent plus le même espace de noms : les collisions disparaissent sans que vous ayez à coordonner les préfixes à la main.
Définir un
identifiersPrefixunique par fichierPassez manuellement un préfixe différent lors de l'obfuscation de chaque fichier (par exemple
identifiersPrefix: 'auth_'pour l'un,checkout_pour l'autre). Efficace, mais source d'erreurs si vous avez beaucoup de fichiers — préférez l'option aléatoire ci-dessus.Passer
identifierNamesGeneratoràhexadecimalLes noms hexadécimaux disposent d'un espace de noms bien plus vaste : la probabilité que deux fichiers produisent le même identifiant devient infime. Compromis : les identifiants sont plus longs qu'avec
mangled-shuffled, donc le bundle est légèrement plus volumineux.Utiliser un plugin de bundler ou l'interface de traitement multi-fichiers
La plupart des plugins de bundler officiels (webpack, Rollup, Vite) garantissent automatiquement l'unicité des préfixes entre les fichiers d'un même build. L'interface obfuscator.io s'en charge également lorsque vous utilisez l'obfuscation multi-fichiers par lot. Si vous mettez en place l'obfuscation manuellement avec l'API npm, c'est à vous d'activer le préfixe aléatoire.
Options associées
randomIdentifiersPrefix— préfixe aléatoire par build (recommandé)identifiersPrefix— chaîne de préfixe expliciteidentifierNamesGenerator— forme des noms (mangled,hexadecimal, …)
