Поле minify: подключение минификации

Минификация в SWC представляет собой этап преобразования JavaScript-кода, при котором исходный код уплотняется: удаляются пробелы, сокращаются имена переменных, упрощаются конструкции и выполняются микро-оптимизации AST. В отличие от классических минификаторов, SWC выполняет эти операции в рамках собственного компиляционного пайплайна, что позволяет совмещать транспиляцию и оптимизацию без дополнительных инструментов.

Поле minify задаётся на верхнем уровне конфигурации SWC и определяет, будет ли выполняться минификация, а также какие именно стратегии оптимизации применяются.


Базовое включение минификации

Самый простой вариант конфигурации включает минификацию целиком:

{
  "minify": true
}

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

  • удаление комментариев;
  • устранение недостижимого кода;
  • упрощение выражений;
  • сокращение локальных идентификаторов;
  • базовые оптимизации ветвлений.

В этом режиме SWC действует как полноценный минификатор без тонкой настройки поведения.


Структурированная конфигурация minify

Для более точного контроля используется объектная форма:

{
  "minify": {
    "compress": true,
    "mangle": true,
    "module": true,
    "ecma": 2020
  }
}

Каждое поле управляет отдельным аспектом оптимизации.


compress: логическая и синтаксическая оптимизация

Поле compress отвечает за преобразование структуры кода без изменения его семантики.

Основные операции:

  • удаление неиспользуемых переменных;
  • сворачивание константных выражений;
  • упрощение условных конструкций;
  • инлайнинг простых выражений;
  • удаление мёртвого кода.

Пример эффекта:

// до
const a = 2 + 2;
if (false) {
  console.log("x");
}

// после minify
const a = 4;

mangle: переименование идентификаторов

Поле mangle включает переименование переменных, функций и параметров в короткие идентификаторы.

{
  "minify": {
    "mangle": true
  }
}

Пример трансформации:

// до
function calculateTotal(price, tax) {
  const totalPrice = price + tax;
  return totalPrice;
}

// после
function a(b, c) {
  const d = b + c;
  return d;
}

Особенности работы:

  • не затрагиваются глобальные идентификаторы (при корректной настройке);
  • учитываются экспортируемые символы в модулях;
  • возможна настройка исключений через дополнительные параметры.

module: особенности минификации модулей

Поле module указывает, что код рассматривается как ES Module.

{
  "minify": {
    "module": true
  }
}

Это влияет на поведение:

  • сохранение экспортов и импортов;
  • корректная обработка top-level scope;
  • предотвращение некорректного переименования экспортируемых сущностей.

В модульном режиме SWC более строго анализирует границы областей видимости.


ecma: целевая версия стандарта

Поле ecma определяет, под какую версию ECMAScript выполняется оптимизация.

{
  "minify": {
    "ecma": 2022
  }
}

Значение влияет на:

  • допустимые синтаксические преобразования;
  • уровень агрессивности оптимизаций;
  • использование современных конструкций при генерации результата.

Более высокая версия ECMAScript позволяет выполнять более точные преобразования, так как набор синтаксических ограничений меньше.


Комплексная конфигурация минификации

В реальных проектах используется комбинация параметров:

{
  "jsc": {
    "parser": {
      "syntax": "ecmascript"
    }
  },
  "minify": {
    "compress": {
      "unused": true,
      "dead_code": true
    },
    "mangle": {
      "toplevel": false
    },
    "module": true,
    "ecma": 2020
  }
}

Такой подход позволяет:

  • контролировать удаление неиспользуемого кода;
  • ограничивать переименование глобального уровня;
  • адаптировать поведение под сборку библиотек или приложений.

Поведение при CLI-использовании

При использовании SWC через CLI минификация включается флагом:

swc input.js -o output.js --minify

При этом используется стандартная конфигурация, эквивалентная minify: true, если не задан .swcrc.

Если присутствует .swcrc, приоритет отдаётся ему, и CLI-флаг становится триггером включения режима.


Взаимодействие минификации с трансформацией

Минификация выполняется после этапа трансформации AST, что означает:

  • сначала код транспилируется (например, TypeScript → JavaScript);
  • затем применяются преобразования SWC;
  • после этого выполняется minify.

Такой порядок критичен, поскольку оптимизации должны работать уже с финальной структурой кода.


Ограничения и поведенческие особенности

Минификация SWC имеет ряд особенностей:

  • агрессивный mangle может затруднить отладку без source maps;
  • некоторые оптимизации отключаются при наличии побочных эффектов;
  • экспортируемые символы сохраняют стабильные имена;
  • динамические конструкции ограничивают глубину оптимизации.

При включённых source maps сохраняется соответствие между оригинальным и преобразованным кодом, что позволяет восстанавливать стек вызовов при ошибках.


Минификация и source maps

Совместное использование выглядит следующим образом:

{
  "sourceMaps": true,
  "minify": true
}

В этом режиме:

  • код минимизируется;
  • генерируется карта соответствий;
  • отладка остаётся возможной в браузере или Node.js.

Source maps становятся обязательным элементом при включённом mangle, так как без них восстановление оригинальной структуры кода становится затруднительным.


Практическое разделение режимов

Условно поведение minify делится на два сценария:

Разработка:

{
  "minify": false
}
  • сохранение читаемости кода;
  • быстрые сборки;
  • отсутствие переименования.

Продакшн:

{
  "minify": {
    "compress": true,
    "mangle": true,
    "module": true
  }
}
  • максимальное уменьшение размера бандла;
  • сокращение времени загрузки;
  • удаление избыточных конструкций.

Связь с архитектурой SWC

Минификация встроена в ядро SWC и использует общий AST-процессор. Это позволяет:

  • избегать повторного парсинга кода;
  • выполнять оптимизации в одном проходе;
  • снижать стоимость сборки по времени.

Архитектурно minify является завершающим этапом трансформационного пайплайна, тесно связанным с генерацией выходного кода.