Как избежать конфликтов идентификаторов в обфусцированных файлах
Когда несколько VM-обфусцированных файлов попадают в один бандл, они могут объявить один и тот же идентификатор верхнего уровня и уронить страницу на этапе разбора. Здесь разбираемся, почему так происходит и как это исправить.
Симптом
Сборка проходит нормально, но браузер падает на этапе разбора, ещё до старта приложения:
Быстрая проверка по бандлу подтверждает, что один и тот же идентификатор объявлен более чем в одном чанке:
Почему так происходит
По умолчанию VM-обфускация использует генератор имён идентификаторов mangled-shuffled. Он проходит по небольшому
алфавиту в детерминированном перемешанном порядке и добавляет префикс vm к глобальным переменным, вводимым средой
выполнения. Оба файла выдают идентификаторы из одной и той же перемешанной последовательности — поэтому первая глобальная
переменная в каждом файле получает одно имя, вторая — другое, и так далее.
Каждый файл обфусцируется независимо, и генератор для каждого начинает свою последовательность с начала. Когда два файла
оказываются в одном бандле, имена совпадают. Два объявления верхнего уровня const vmd = … попадают в одну область
видимости, и парсер отвергает второе.
Как исправить
Выберите один из вариантов ниже — первый является рекомендуемым:
Включите
randomIdentifiersPrefix(рекомендуется)Каждый запуск обфускации получает уникальный случайный префикс, добавляемый к каждому сгенерированному идентификатору. Имена из разных файлов больше не делят одно пространство имён, поэтому конфликты исчезают без ручного согласования префиксов.
Задайте уникальный
identifiersPrefixдля каждого файлаВручную передавайте разный префикс при обфускации каждого файла (например,
identifiersPrefix: 'auth_'для одного,checkout_для другого). Работает, но легко ошибиться, если файлов много, — предпочтите случайный вариант выше.Смените
identifierNamesGeneratorнаhexadecimalШестнадцатеричные имена используют куда большее пространство ключей, поэтому вероятность того, что два файла выдадут одинаковый идентификатор, исчезающе мала. Компромисс: идентификаторы длиннее, чем у
mangled-shuffled, поэтому бандл немного крупнее.Используйте плагин сборщика или пакетный интерфейс для нескольких файлов
Большинство официальных плагинов сборщиков (webpack, Rollup, Vite) автоматически обеспечивают уникальность префиксов для файлов в рамках сборки. Интерфейс obfuscator.io тоже делает это при пакетной обфускации нескольких файлов. Если вы настраиваете обфускацию вручную через npm-API, случайный префикс придётся включить самостоятельно.
Связанные опции
randomIdentifiersPrefix— случайный префикс на каждую сборку (рекомендуется)identifiersPrefix— явная строка-префиксidentifierNamesGenerator— форма имени (mangled,hexadecimal, …)
