Documentation
/
Recettes
/

Éviter les collisions d'identifiants

É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 :

browser console

Error

Une vérification rapide sur l'ensemble du bundle confirme que le même identifiant est déclaré dans plusieurs chunks :

terminal

Shell

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 identifiersPrefix unique par fichier

    Passez 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 à hexadecimal

    Les 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