Документация
/
Рецепты
/

Как избежать конфликтов идентификаторов

Как избежать конфликтов идентификаторов в обфусцированных файлах

Когда несколько VM-обфусцированных файлов попадают в один бандл, они могут объявить один и тот же идентификатор верхнего уровня и уронить страницу на этапе разбора. Здесь разбираемся, почему так происходит и как это исправить.

Симптом

Сборка проходит нормально, но браузер падает на этапе разбора, ещё до старта приложения:

browser console

Ошибка

Быстрая проверка по бандлу подтверждает, что один и тот же идентификатор объявлен более чем в одном чанке:

terminal

Shell

Почему так происходит

По умолчанию VM-обфускация использует генератор имён идентификаторов mangled-shuffled. Он проходит по небольшому алфавиту в детерминированном перемешанном порядке и добавляет префикс vm к глобальным переменным, вводимым средой выполнения. Оба файла выдают идентификаторы из одной и той же перемешанной последовательности — поэтому первая глобальная переменная в каждом файле получает одно имя, вторая — другое, и так далее.

Каждый файл обфусцируется независимо, и генератор для каждого начинает свою последовательность с начала. Когда два файла оказываются в одном бандле, имена совпадают. Два объявления верхнего уровня const vmd = … попадают в одну область видимости, и парсер отвергает второе.

Как исправить

Выберите один из вариантов ниже — первый является рекомендуемым:

  • Включите randomIdentifiersPrefix (рекомендуется)

    Каждый запуск обфускации получает уникальный случайный префикс, добавляемый к каждому сгенерированному идентификатору. Имена из разных файлов больше не делят одно пространство имён, поэтому конфликты исчезают без ручного согласования префиксов.

  • Задайте уникальный identifiersPrefix для каждого файла

    Вручную передавайте разный префикс при обфускации каждого файла (например, identifiersPrefix: 'auth_' для одного, checkout_ для другого). Работает, но легко ошибиться, если файлов много, — предпочтите случайный вариант выше.

  • Смените identifierNamesGenerator на hexadecimal

    Шестнадцатеричные имена используют куда большее пространство ключей, поэтому вероятность того, что два файла выдадут одинаковый идентификатор, исчезающе мала. Компромисс: идентификаторы длиннее, чем у mangled-shuffled, поэтому бандл немного крупнее.

  • Используйте плагин сборщика или пакетный интерфейс для нескольких файлов

    Большинство официальных плагинов сборщиков (webpack, Rollup, Vite) автоматически обеспечивают уникальность префиксов для файлов в рамках сборки. Интерфейс obfuscator.io тоже делает это при пакетной обфускации нескольких файлов. Если вы настраиваете обфускацию вручную через npm-API, случайный префикс придётся включить самостоятельно.

Связанные опции