Добавить в корзинуПозвонить
Найти в Дзене
Цифровая Переплавка

Как «разгрузить» монорепозиторий: опыт удаления 120 зависимостей

Современные Nx-монорепозитории часто напоминают неуправляемый склад: пакеты накапливаются, CI/CD работает медленнее, уведомления о CVE заваливают разработчиков, а реальная польза от половины зависимостей — под вопросом. Автор статьи John James показал отличный пример того, как можно аккуратно провести «генеральную уборку» и не поломать проект. 🔧 Почему Knip, а не depcheck?
Многие привыкли к depcheck, но у этого инструмента есть проблема: он уже морально устарел и плохо понимает современные связки, особенно монорепозитории.
Knip же: 🧪 Алгоритм очистки, который сработал Автор статьи предложил простой, но надёжный процесс: 🚀 Запуск Knip yarn dlx knip 🛠 Удаление кандидатов 🧪 Прогонка проверок 📝 Игнор-лист 📊 Результаты 💡 Интересные моменты, на которые стоит обратить внимание ⚡ Ложные срабатывания. Knip иногда «не видит» зависимости, которые используются косвенно: 🛡 Безопасность PR. Автор не дробил изменения на десятки мелких PR, а сделал один большой, но: 🔥 Knip умеет больше: он м

Современные Nx-монорепозитории часто напоминают неуправляемый склад: пакеты накапливаются, CI/CD работает медленнее, уведомления о CVE заваливают разработчиков, а реальная польза от половины зависимостей — под вопросом. Автор статьи John James показал отличный пример того, как можно аккуратно провести «генеральную уборку» и не поломать проект.

🔧 Почему Knip, а не depcheck?
Многие привыкли к
depcheck, но у этого инструмента есть проблема: он уже морально устарел и плохо понимает современные связки, особенно монорепозитории.
Knip же:

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

🧪 Алгоритм очистки, который сработал

Автор статьи предложил простой, но надёжный процесс:

🚀 Запуск Knip

yarn dlx knip

🛠 Удаление кандидатов

  • Удаляем пакет.
  • Смотрим, что сломалось.

🧪 Прогонка проверок

  • yarn nx affected -t build test lint
  • локальный запуск yarn nx run <app>:serve
  • smoke-тесты (быстрый прогон пользовательских сценариев).

📝 Игнор-лист

  • Если зависимость нужна (например, только в CI или в Jest-конфиге) — возвращаем и фиксируем её в knip.config.js.

📊 Результаты

  • 📉 Минус 120 пакетов (с 510 → до 390).
  • ⏱ Установка yarn install стала быстрее на ~1 минуту.
  • 🔐 Количество предупреждений о CVE заметно снизилось.
  • 🧘 Разработчики получили «тише и чище» окружение.

💡 Интересные моменты, на которые стоит обратить внимание

Ложные срабатывания. Knip иногда «не видит» зависимости, которые используются косвенно:

  • плагины в конфигурациях,
  • CLI-инструменты только для CI,
  • type-only пакеты.

🛡 Безопасность PR. Автор не дробил изменения на десятки мелких PR, а сделал один большой, но:

  • протестировал его на отдельной ветке,
  • сделал превью-деплой,
  • замержил в «тихое окно».

🔥 Knip умеет больше: он может находить не только зависимости, но и мертвый код — неиспользуемые файлы, типы, enum'ы. Отличный инструмент для постоянной «санитарии».

🎯 Моё мнение
Такой подход — это не просто косметика. Монорепо с сотнями «висячих» пакетов — это:

  • ❌ более долгие билды,
  • ❌ больше рисков уязвимостей,
  • ❌ сложнее мейнтенанс.

Инструменты вроде Knip превращают уборку из хаотичного процесса в системный цикл. Идея встроить Knip в CI как «мягкий репорт» на ранних стадиях — шикарна. Это помогает держать репозиторий в форме, не дожидаясь, пока он обрастёт зависимостями как корабль ракушками.

🔗 Источник: Cleaning house in Nx monorepo, how I removed 120 unused deps safely

🔗 Knip: https://knip.dev

🔗 Depcheck: https://www.npmjs.com/package/depcheck