Настройки сжатия: passes, drop_console, drop_debugger

В системе трансформации и минификации SWC ключевую роль играет этап сжатия (minify), который отвечает за уменьшение размера итогового JavaScript-кода за счёт удаления лишних конструкций, упрощения выражений и оптимизации структуры. Среди наиболее часто используемых параметров конфигурации выделяются passes, drop_console и drop_debugger, поскольку они напрямую влияют как на размер бандла, так и на поведение приложения в production-среде.

Архитектура минификации SWC

Минификация в SWC реализуется как набор проходов (passes), каждый из которых выполняет собственный класс оптимизаций. Эти проходы работают поверх AST (Abstract Syntax Tree), последовательно модифицируя дерево программы:

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

Конфигурация минификации обычно задаётся через поле jsc.minify:

{
  "jsc": {
    "minify": {
      "compress": true
    }
  }
}

Дополнительные параметры управляют глубиной и агрессивностью оптимизаций.

Параметр passes

passes определяет количество последовательных проходов оптимизации, которые SWC выполняет над AST.

Суть работы passes

Каждый проход — это повторное применение набора правил оптимизации. Увеличение числа проходов позволяет:

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

Поведение при разных значениях

  • passes: 1 — минимальная оптимизация, быстрый билд, слабое сжатие.
  • passes: 2 — баланс между скоростью и качеством минификации.
  • passes: 3+ — более глубокая оптимизация, но с возрастающей стоимостью компиляции.

Практическая интерпретация

Многие оптимизации в JavaScript являются итеративными. Например:

  1. Удаление условия делает код внутри блока недостижимым.
  2. После удаления появляются новые возможности для свёртки выражений.
  3. Следующий проход может дополнительно упростить уже преобразованный код.

Пример конфигурации

{
  "jsc": {
    "minify": {
      "compress": {
        "passes": 2
      }
    }
  }
}

Использование passes выше 3 редко оправдано в веб-приложениях, поскольку прирост в размере кода обычно становится минимальным по сравнению с увеличением времени сборки.

Параметр drop_console

drop_console управляет удалением вызовов console.* из итогового бандла.

Логика работы

При включении параметра SWC удаляет все выражения, содержащие обращения к объекту console:

  • console.log
  • console.info
  • console.warn
  • console.error
  • console.debug

Удаление происходит на уровне AST, что гарантирует отсутствие следов вызова в финальном коде.

Поведение и ограничения

  • Удаляются только прямые вызовы console.*.
  • Обёртки вокруг console (например, const log = console.log) не гарантированно удаляются.
  • Вызовы через динамические ссылки могут сохраняться.

Влияние на код

Пример исходного кода:

function init() {
  console.log("init");
  console.error("error");
  return true;
}

После минификации с drop_console: true:

function init(){return!0}

Конфигурация

{
  "jsc": {
    "minify": {
      "compress": {
        "drop_console": true
      }
    }
  }
}

Производственные сценарии

Удаление console используется для:

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

Параметр drop_debugger

drop_debugger удаляет все выражения debugger из кода.

Механизм работы

Инструкция debugger в JavaScript принудительно останавливает выполнение в инструментах разработчика. В production-коде она не несёт функциональной нагрузки и рассматривается как отладочный артефакт.

SWC полностью удаляет такие узлы AST:

function run() {
  debugger;
  return compute();
}

После минификации:

function run(){return compute()}

Особенности удаления

  • Удаляются все standalone debugger выражения.
  • Не зависит от контекста выполнения.
  • Не требует дополнительных проверок или условий.

Конфигурация

{
  "jsc": {
    "minify": {
      "compress": {
        "drop_debugger": true
      }
    }
  }
}

Совместное использование passes, drop_console и drop_debugger

Эти параметры часто применяются совместно, формируя базовую стратегию production-минификации.

Типовая конфигурация

{
  "jsc": {
    "minify": {
      "compress": {
        "passes": 2,
        "drop_console": true,
        "drop_debugger": true
      }
    }
  }
}

Поведение при совместной работе

  • drop_console и drop_debugger уменьшают размер кода за счёт удаления побочных выражений.
  • passes позволяет дополнительно оптимизировать структуру после удаления.
  • Удалённые узлы могут открывать новые возможности для dead-code elimination.

Влияние на производительность сборки

Стоимость passes

Каждый дополнительный проход увеличивает:

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

При этом прирост сжатия носит убывающий характер.

Стоимость drop_console и drop_debugger

Эти параметры практически не влияют на время сборки, поскольку:

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

Практические паттерны конфигурации

Быстрая сборка

{
  "jsc": {
    "minify": {
      "compress": {
        "passes": 1,
        "drop_console": true,
        "drop_debugger": true
      }
    }
  }
}

Используется для CI или локальной разработки production-подобных сборок.

Баланс качества и скорости

{
  "jsc": {
    "minify": {
      "compress": {
        "passes": 2,
        "drop_console": true,
        "drop_debugger": true
      }
    }
  }
}

Оптимальный вариант для большинства веб-приложений.

Агрессивная минификация

{
  "jsc": {
    "minify": {
      "compress": {
        "passes": 3,
        "drop_console": true,
        "drop_debugger": true
      }
    }
  }
}

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