Выбор ответа Middle Пакеты и зависимости обновлено

Фантомные зависимости

Вопрос

Код импортирует debug, хотя его нет в package.json проекта, и всё работает на npm. После перехода на pnpm импорт падает. Почему?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: npm поднимает транзитивные в корень, pnpm даёт только объявленные. Это фантомная зависимость: debug пришёл как зависимость другого пакета, npm поднял его в корень, и импорт заработал случайно. pnpm строит строгую структуру через ссылки, поэтому проблема вскрылась.

Варианты ответа

  1. pnpm не поддерживает пакет debug из-за его postinstall-скрипта и пропускает
  2. npm поднимает транзитивные в корень, pnpm даёт только объявленныеправильный ответ
  3. pnpm ставит пакеты только при первом импорте в коде
  4. pnpm требует указывать полные пути к файлам пакетов

Разбор

Это фантомная зависимость: debug пришёл как зависимость другого пакета, npm поднял его в корень, и импорт заработал случайно. pnpm строит строгую структуру через ссылки, поэтому проблема вскрылась. Лечится явным добавлением debug в package.json.

  • pnpm ставит любые пакеты из реестра.
  • Ленивой установки по импорту нет.
  • Пути к пакетам pnpm разрешает так же, как Node.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.