Что такое транзитивные зависимости
Что проверяют
Понимаете ли вы, что в проект приезжает намного больше чужого кода, чем перечислено в описании зависимостей, и умеете ли этим управлять: лок-файл, дубликаты в дереве, вес бандла, уязвимости.
Как отвечать
Прямые зависимости это то, что вы установили сами. Транзитивные приезжают как зависимости ваших зависимостей и дальше вглубь на много уровней. В описании проекта их нет, полный слепок графа лежит в лок-файле, поэтому он коммитится.
Важная особенность экосистемы: одна и та же библиотека разных версий спокойно уживается в дереве в нескольких экземплярах, менеджер пакетов раскладывает их по вложенным каталогам. Это не ошибка сборки, а тихий дубль в бандле.
Инструменты, которые стоит назвать:
- вывод дерева по конкретному пакету, чтобы понять, кто его притащил;
- принудительная версия для вложенной зависимости через переопределения в описании проекта;
- одноранговые зависимости как способ сказать «мне нужен ваш экземпляр, а не свой»;
- строгое дерево
pnpm, которое не даёт импортировать то, что вы не объявляли.
Фронтенд-специфика: транзитивные пакеты прямо влияют на вес загружаемого кода, а удаление неиспользуемого не спасает от того, что реально импортируется в рантайме.
Где спотыкаются
Верят, что менеджер пакетов сам разрулит конфликт версий. Он разрулит установку, но не совместимость: два экземпляра библиотеки представления в дереве дают ошибку про недопустимый вызов хука, два экземпляра клиента запросов дают два независимых кэша. Диагностика начинается с дерева зависимостей, а не с переустановки.
Обновляют только прямые зависимости и удивляются, что аудит продолжает ругаться. Уязвимость сидит на третьем уровне вглубь, и двигается она обновлением родителя, точечным переопределением версии или отказом от пакета. Свежая версия вашей библиотеки сама по себе вложенную не поднимает.
Пользуются тем, что пакет оказался доступен транзитивно, и импортируют его напрямую, не объявляя. Работает до первой очистки дерева, смены менеджера пакетов или обновления родителя, после чего сборка падает на ровном месте. Сюда же привычка тащить крупную утилиту ради одной функции: вместе с ней приезжает десяток модулей и заметный вес.