Минификация идентификаторов в SWC основана на анализе области видимости и построении таблицы символов, в которой каждому объявлению сопоставляется уникальный внутренний узел. На этапе трансформации исходного кода все локальные переменные, функции, параметры и внутренние символы модулей заменяются на более короткие имена, при этом сохраняется семантика программы и исключаются конфликты в пределах одной области видимости.
Ключевой этап перед переименованием заключается в обходе AST и построении дерева областей видимости. Каждый блок, функция и модуль формирует собственный scope, внутри которого регистрируются объявления:
var, let, const
SWC создаёт символическую таблицу, где каждый идентификатор связывается с уникальным идентификатором внутри компилятора. Это позволяет различать одноимённые переменные в разных контекстах и предотвращать некорректные замены.
Особое значение имеет разделение на глобальные и локальные области. Глобальные символы либо не изменяются, либо переименовываются с учётом конфигурации, чтобы не нарушить взаимодействие с внешними окружениями (например, браузерными API или Node.js глобалами).
После завершения анализа SWC переходит к генерации новых идентификаторов. Используется последовательное кодирование, аналогичное base52/base64-подобным схемам, где имена формируются из набора допустимых символов Jav * aScript:
a–z, A–Z
0–9
Генератор гарантирует уникальность имён внутри одного scope, увеличивая длину идентификатора только при исчерпании пространства коротких комбинаций.
Пример преобразования:
calculateTotalPrice → a
items → b
index → c
При этом вложенные области могут использовать те же короткие имена, поскольку их пространства изолированы.
Основная сложность минификации идентификаторов заключается в корректной обработке ссылок. Каждое использование переменной должно быть связано с её декларацией через symbol resolution. SWC опирается на предварительно построенные ссылки между узлами AST.
При переименовании учитываются следующие ограничения:
Пример:
const { token, user } = response;
console.log(token, user);
После минификации:
const { a, b } = response;
console.log(a, b);
Здесь сохраняется связь между паттерном деструктуризации и ссылками на значения.
Функции получают собственную область видимости, включая параметры. SWC рассматривает параметры как локальные символы, которые могут быть переименованы независимо от внешних переменных.
function fetchData(url, options) {
const result = request(url, options);
return result;
}
Преобразуется в:
function a(b, c) {
const d = request(b, c);
return d;
}
Особое внимание уделяется функциям высшего порядка и вложенным функциям, где возможны перекрытия имён. В таких случаях генератор имён использует разные пространства символов для каждого уровня вложенности.
В классах SWC отдельно обрабатывает:
Имена методов рассматриваются как свойства прототипа и могут быть минифицированы только при условии, что доступ к ним не осуществляется через строковые литералы.
class UserService {
getUser(id) {
return db.find(id);
}
}
Преобразуется в:
class a {
b(c) {
return db.find(c);
}
}
При этом имя класса может быть сохранено или изменено в зависимости от настроек, например при включённой опции сохранения имён классов для отладки.
В ECMAScript модулях SWC учитывает связи между import и
export. Экспортируемые символы могут быть переименованы
локально, но их внешнее имя должно сохраняться либо транслироваться в
соответствии с экспортной таблицей.
export function parseConfig(input) {
return JSON.parse(input);
}
После обработки:
export function a(b) {
return JSON.parse(b);
}
При этом импортирующие модули получают корректную привязку через реэкспортную карту, что исключает разрыв связей.
При генерации коротких идентификаторов возможны коллизии между разными типами символов. SWC решает эту проблему через:
var и function declarations
Зарезервированные идентификаторы (eval,
arguments, super, ключевые слова языка)
исключаются из пула генерации.
Дополнительно учитываются глобальные объекты окружения. Например, в
браузере нельзя без специальной настройки переименовывать
window или document, если они используются
напрямую.
Конфигурация SWC позволяет тонко управлять поведением алгоритма:
Эти параметры влияют на этап генерации символов и фильтрацию узлов AST перед переименованием.
Минификация идентификаторов тесно связана с другими оптимизациями:
После удаления ненужных узлов уменьшается количество символов, подлежащих переименованию, что повышает эффективность генерации коротких имён и снижает вероятность длинных идентификаторов в итоговом коде.
При этом порядок проходов имеет значение: сначала выполняется анализ и упрощение AST, затем — переименование символов, после чего возможны дополнительные проходы для финальной очистки.