Опция --watch: отслеживание изменений

Флаг –watch в CLI SWC активирует режим непрерывной компиляции, при котором инструмент отслеживает изменения в исходных файлах и автоматически пересобирает только затронутые модули. Это ключевой механизм для ускорения разработки, поскольку исключает необходимость ручного запуска сборки после каждого изменения кода.

SWC реализует наблюдение за файловой системой через событийную модель: при изменении, создании или удалении файла триггерится пересборка соответствующих частей проекта. В отличие от полной пересборки, здесь используется инкрементальный подход, что снижает нагрузку на CPU и ускоряет цикл «изменил → увидел результат».


Базовое использование

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

swc src -d dist --watch

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

  • src — входная директория с исходным кодом
  • -d dist — директория для выходных файлов
  • –watch — включение режима отслеживания изменений

После запуска процесс не завершается, а продолжает работать в фоне, ожидая файловых событий.

Для TypeScript-проектов команда остается аналогичной:

swc src -d dist --watch

При наличии tsconfig.json SWC учитывает конфигурацию типизации, но сам режим watch не зависит от TypeScript напрямую — он работает на уровне файловой системы.


Принцип работы файлового наблюдателя

Режим –watch строится вокруг мониторинга изменений в файловой системе. SWC реагирует на следующие события:

  • изменение содержимого файла
  • добавление нового файла
  • удаление файла
  • переименование (через комбинацию удаления и создания)

В большинстве окружений используется механизм, близкий к fs.watch или более надежные абстракции уровня chokidar-подобных наблюдателей (в зависимости от платформы и сборки SWC CLI).

Ключевая задача — минимизировать количество повторных компиляций. Поэтому изменения группируются и обрабатываются с небольшой задержкой (debounce), чтобы избежать каскадных пересборок при массовом сохранении файлов редактором.


Инкрементальная компиляция в режиме watch

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

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

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


Поведение при изменениях зависимостей

При изменении файла, который импортируется другими модулями, SWC:

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

Пример:

a.ts → импортируется b.ts → импортируется c.ts

Изменение a.ts может вызвать пересборку b.ts и c.ts, но не затронет независимые части проекта.


Конфигурация watch-режима

Хотя –watch является CLI-флагом, его поведение косвенно зависит от конфигурации .swcrc.

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

{
  "jsc": {
    "parser": {
      "syntax": "typescript"
    },
    "target": "es2020"
  },
  "module": {
    "type": "es6"
  }
}

Watch-режим не добавляет специальных настроек в конфиг, но влияет на процесс обработки, используя те же правила трансформации.


Исключение файлов и директорий

В проектах часто требуется исключить из наблюдения:

  • node_modules
  • dist
  • временные файлы сборки
  • кэш директории

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


Производительность watch-режима

Эффективность режима зависит от нескольких факторов:

Размер проекта

Чем больше файлов, тем выше нагрузка на наблюдатель, но компиляция остаётся частичной.

Тип файловой системы

На Linux часто используется inotify, на macOS — FSEvents, на Windows — ReadDirectoryChangesW. Различия влияют на задержки реакции и стабильность событий.

Частота изменений

Редакторы кода могут генерировать серию быстрых изменений (auto-save, форматирование), что вызывает несколько событий подряд. SWC сглаживает это через debounce-механизмы.


Особенности работы в монорепозиториях

В монорепозиториях режим –watch может сталкиваться с проблемами:

  • слишком большое количество отслеживаемых файлов
  • перекрёстные зависимости пакетов
  • дублирующиеся сборочные директории

Рекомендуется разделять watch-запуски по пакетам:

swc packages/app/src -d packages/app/dist --watch
swc packages/lib/src -d packages/lib/dist --watch

Такой подход уменьшает нагрузку и упрощает диагностику изменений.


Сравнение с другими watch-системами

SWC vs esbuild

  • SWC: фокус на трансформации и TypeScript
  • esbuild: более агрессивная оптимизация и встроенный bundling

Оба инструмента поддерживают watch, но SWC чаще используется как трансформер, а не бандлер.

SWC vs webpack

Webpack watch:

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

SWC watch:

  • работает на уровне трансформации файлов
  • быстрее при простых пайплайнах (compile-only сценарии)

Интеграция с внешними процессами

Режим –watch часто используется совместно с другими инструментами:

  • nodemon для перезапуска Node.js сервера
  • concurrently для параллельных процессов
  • tsc –watch в смешанных TypeScript пайплайнах

Пример связки:

swc src -d dist --watch &
nodemon dist/index.js

SWC отвечает за компиляцию, nodemon — за перезапуск рантайма.


Обработка ошибок в watch-режиме

При возникновении ошибок компиляции SWC:

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

Это позволяет исправить ошибку и сразу увидеть результат без перезапуска сборщика.

Особенно важно, что watch-режим устойчив к синтаксическим ошибкам в промежуточном состоянии редактирования файла.


Поведение при удалении файлов

Удаление файла в watch-режиме приводит к:

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

Если файл был частью цепочки импортов, SWC корректирует граф модулей, исключая несуществующие зависимости.


Задержки и debounce-логика

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

Типичный сценарий:

  • пользователь сохраняет файл
  • редактор вызывает несколько событий подряд
  • SWC ожидает короткий интервал
  • выполняется одна компиляция вместо серии

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


Ограничения watch-режима

Несмотря на эффективность, режим имеет ограничения:

  • не предназначен для сложного bundling-графа
  • не выполняет оптимизацию на уровне бандла
  • не заменяет полноценные сборщики в production

Watch-режим ориентирован исключительно на разработку и быстрый feedback loop.


Типичные сценарии использования

  • разработка библиотек на TypeScript с быстрым пересбором
  • серверные приложения Node.js с hot reload через внешние инструменты
  • микросервисы с минимальной сборочной логикой
  • прототипирование модулей без bundler-слоя

SWC в этом режиме выступает как быстрый транслятор, минимизирующий задержку между изменением кода и его исполнением.