#Что означает ошибка
ERESOLVE
Ошибка ERESOLVE появилась в npm 7: менеджер стал строго проверять peer-зависимости — требования пакетов к версиям библиотек, которые должны быть установлены рядом (например, плагин требует React 17, а в проекте React 18). Раньше npm лишь предупреждал, теперь отказывается ставить пакеты, если дерево зависимостей противоречиво.
Сообщение содержит конфликт версий: какая версия обнаружена (Found), какую ожидает пакет (peer) и откуда возникло требование. Сравните все эти значения с package.json и официальной таблицей совместимости.
Исправьте конфликт peer-зависимостей или используйте --legacy-peer-deps.
#Причины и решения
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Конфликт peerВерсии. | Проявляется как «ERESOLVE» или близкий по смыслу сбой. | Подберите. |
| Новый npm 7+Строго. | Проявляется как «ERESOLVE» или близкий по смыслу сбой. | --legacy-peer-deps. |
| Старый пакетУстарел. | Проявляется как «ERESOLVE» или близкий по смыслу сбой. | Обновите. |
| lock-файлСтарый. | Проявляется как «ERESOLVE» или близкий по смыслу сбой. | Пересоздайте. |
#Кратко: причина, признак, действие
| Причина | Как узнать | Что делать |
|---|---|---|
| Несовместимые peerDependencies | В выводе указаны Found, Could not resolve dependency и требуемый peer-диапазон | Подберите совместимое сочетание версий по документации; обновляйте пакет адресно. |
| В новом npm проявился старый конфликт | На npm 7+ установка стала строже, а старый пакет требует другую основную библиотеку | Исправьте версии; --legacy-peer-deps лишь временная проверка на отдельной копии. |
| Устаревший пакет или плагин | Нет версии плагина, совместимой с текущей основной библиотекой | Замените пакет на поддерживаемый либо согласованно смените основную библиотеку. |
| Разошлись package.json и package-lock.json | npm ci сообщает несоответствие блокировки описанию проекта | Измените зависимости согласованно и обновите lock через npm install; не удаляйте его автоматически. |
#Пошаговое решение
- Прочитайте именно конфликт версийОткройте терминал в корне проекта (папка с
package.json), выполнитеnode --version,npm --versionи повторитеnpm install. В выводе найдитеFound:,Could not resolve dependencyиpeer ... from ...— запишите названия и диапазоны версий. Если это чужой проект, не меняйте его зависимости без согласования с владельцем. - Посмотрите зависимости проекта и блокировку версийВ редакторе откройте
package.jsonи найдите пакеты из сообщения; проверьте также, есть лиpackage-lock.json. Командаnpm ls ИМЯ_ПАКЕТА(подставьте фактическое имя) показывает установленную цепочку, но при сломанном дереве может завершиться ошибкой — это диагностический признак. Сравните требованияpeerDependenciesс версиями в проекте. Не удаляйтеpackage-lock.jsonавтоматически: он нужен для воспроизводимой сборки. - Подберите совместимые версии по документацииПерейдите в официальную документацию или реестр npm для конфликтующего пакета, откройте раздел
peerDependenciesи таблицу совместимости. Найдите версию пакета, которая поддерживает вашу основную библиотеку (например, React, ESLint, Angular), а не просто последнюю. Внесите только согласованное изменение вpackage.json, затем выполнитеnpm install. Проверьтеnpm lsи соберите проект командой из егоscripts, напримерnpm run build, если такой сценарий существует. - Используйте обход только для временной диагностикиЕсли нужно временно оценить совместимость, в отдельной ветке Git или копии проекта можно попробовать
npm install --legacy-peer-deps. Этот параметр игнорирует контрактpeerDependenciesи может установить несовместимый набор; он не является основным решением. После проверки удалите временную ветку или верните исходные файлы, а не устанавливайтеnpm config set legacy-peer-deps trueдля всех проектов. - Не подменяйте совместимость overrides и очисткойПоле
overridesменяет разрешение вложенных зависимостей, но само по себе не устраняет несовместимый peer API. Не делайте массовоеrm -rf node_modules package-lock.json: это ухудшает воспроизводимость. Если зависимости повреждены, сохранитеpackage-lock.jsonи на чистой рабочей копии запуститеnpm ciтолько если блокировка версий уже согласована сpackage.json. - Проверьте установленное дерево и работу программыПосле выбранного исправления выполните
npm lsи проектные тесты/сборку (npm testилиnpm run build— только если скрипты определены вpackage.json). Убедитесь, что ошибка ERESOLVE исчезла и приложение работает. При конфликте, который невозможно согласовать, сохраните вывод команд с названиями пакетов и обратитесь к владельцу проекта; не публикуйте закрытые адреса и токены npm.
#Как правильно решать конфликт
Надёжные варианты: выбрать выпуск конфликтующего пакета, совместимый с версией основной библиотеки, либо согласованно обновить/понизить основную библиотеку. Поле overrides меняет вложенные зависимости, но не гарантирует устранения несовместимого peer API и не должно служить автоматическим решением.
#Флаги --legacy-peer-deps и --force
Флаг --legacy-peer-deps возвращает поведение npm 6: peer-зависимости не проверяются. Он удобен, чтобы запустить старый проект, но скрывает реальную несовместимость, которая может проявиться ошибками во время работы. Флаг --force ещё агрессивнее: он ставит пакеты вопреки конфликтам. Используйте их как временную меру, а не как постоянное решение.
#Профилактика
Храните и проверяйте package-lock.json вместе с package.json в системе контроля версий; обновляйте зависимости небольшими согласованными группами. Если проекту требуется особый режим npm, документируйте его в инструкции проекта, но не включайте глобально небезопасный обход peer-проверки.
npm view react-scripts peerDependenciesnpm install --legacy-peer-depsКоманда может изменить состояние системы или её настройки. Проверьте параметры и последствия перед запуском.