В системе трансформации и минификации SWC ключевую роль играет этап
сжатия (minify), который отвечает за уменьшение размера итогового
JavaScript-кода за счёт удаления лишних конструкций, упрощения выражений
и оптимизации структуры. Среди наиболее часто используемых параметров
конфигурации выделяются passes, drop_console и
drop_debugger, поскольку они напрямую влияют как на размер
бандла, так и на поведение приложения в production-среде.
Минификация в SWC реализуется как набор проходов (passes), каждый из которых выполняет собственный класс оптимизаций. Эти проходы работают поверх AST (Abstract Syntax Tree), последовательно модифицируя дерево программы:
Конфигурация минификации обычно задаётся через поле
jsc.minify:
{
"jsc": {
"minify": {
"compress": true
}
}
}
Дополнительные параметры управляют глубиной и агрессивностью оптимизаций.
passes определяет количество последовательных проходов
оптимизации, которые SWC выполняет над AST.
Каждый проход — это повторное применение набора правил оптимизации. Увеличение числа проходов позволяет:
passes: 1 — минимальная оптимизация, быстрый билд, слабое
сжатие.
passes: 2 — баланс между скоростью и качеством минификации.
passes: 3+ — более глубокая оптимизация, но с возрастающей
стоимостью компиляции.
Многие оптимизации в JavaScript являются итеративными. Например:
{
"jsc": {
"minify": {
"compress": {
"passes": 2
}
}
}
}
Использование passes выше 3 редко оправдано в
веб-приложениях, поскольку прирост в размере кода обычно становится
минимальным по сравнению с увеличением времени сборки.
drop_console управляет удалением вызовов
console.* из итогового бандла.
При включении параметра SWC удаляет все выражения, содержащие обращения
к объекту console:
console.log
console.info
console.warn
console.error
console.debug
Удаление происходит на уровне AST, что гарантирует отсутствие следов вызова в финальном коде.
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 используется для:
drop_debugger удаляет все выражения debugger
из кода.
Инструкция debugger в JavaScript принудительно
останавливает выполнение в инструментах разработчика. В production-коде
она не несёт функциональной нагрузки и рассматривается как отладочный
артефакт.
SWC полностью удаляет такие узлы AST:
function run() {
debugger;
return compute();
}
После минификации:
function run(){return compute()}
debugger выражения.
{
"jsc": {
"minify": {
"compress": {
"drop_debugger": true
}
}
}
}
Эти параметры часто применяются совместно, формируя базовую стратегию production-минификации.
{
"jsc": {
"minify": {
"compress": {
"passes": 2,
"drop_console": true,
"drop_debugger": true
}
}
}
}
drop_console и drop_debugger уменьшают размер
кода за счёт удаления побочных выражений.
passes позволяет дополнительно оптимизировать структуру
после удаления.
Каждый дополнительный проход увеличивает:
При этом прирост сжатия носит убывающий характер.
Эти параметры практически не влияют на время сборки, поскольку:
{
"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
}
}
}
}
Используется в библиотеках и критичных по размеру дистрибутивах, где важен каждый байт итогового кода.