Acabo de encontrarme con este error:
npm ERR! code ERESOLVE npm ERR! ERESOLVE unable to resolve dependency tree npm ERR! npm ERR! While resolving: nexttwin@0.1.0 npm ERR! Found: react@17.0.1 npm ERR! node_modules/react npm ERR! react@"17.0.1" from the root project npm ERR! npm ERR! Could not resolve dependency: npm ERR! peer react@"^16.8.0" from react-hook-mousetrap@2.0.4 npm ERR! node_modules/react-hook-mousetrap npm ERR! react-hook-mousetrap@"*" from the root project npm ERR!
El módulo que estoy tratando de instalar parece tener una dependencia de pares diferente a la que he instalado. Parece que npm cambió su comportamiento en este sentido y ahora deja que la instalación falle.
¿Qué puedo hacer ahora para arreglar esto? No quiero degradar mi versión de React por esto.
Sé que hay un indicador llamado --legacy-peer-deps
pero no estoy seguro de qué hace exactamente y si se recomienda usarlo/cuáles son las posibles desventajas. Supongo que hay una razón por la que npm dejó que fallara la instalación.
Es extraño porque estaba usando yarn
hasta hace muy poco y todo estaba bien.
Una forma de pensar en esta bandera es que no está haciendo algo nuevo; más bien le está diciendo a NPM que no haga algo nuevo, ya que NPM v7 ahora instala peerDependencies de forma predeterminada .
En muchos casos, esto genera conflictos de versión, lo que interrumpirá el proceso de instalación.
El --legacy-peer-deps
se introdujo con v7 como una forma de evitar la instalación automática de peerDependency; le dice a NPM que ignore los departamentos de pares y continúe con la instalación de todos modos. Así es como solían ser las cosas con NPM v4 a v6.
Si no tiene clara la diferencia entre los departamentos regulares y los departamentos de pares, aquí tiene un poco de contexto:
Dependencias: Bibliotecas o módulos que necesita un módulo NPM para poder trabajar en producción . (Ejemplo: recientemente construí una biblioteca de simulación de gráficos circulares que usa Chance.js para calcular números aleatorios dentro de un rango específico; por lo tanto, Chance es una dependencia de mi módulo).
peerDependencies : una dependencia de pares es una versión específica o un conjunto de versiones de una biblioteca de software de terceros con la que un módulo está diseñado para funcionar . Son similares en concepto a la relación entre una extensión de navegador y un navegador. (Ejemplo: react-redux tiene dos peerDependencies bastante lógicas: react
y redux
).
Debido a la gran cantidad de módulos que no han agregado específicamente React v17 como una dependencia de pares, ahora es común encontrar el error de unable to resolve dependency tree
cuando se ejecutan instalaciones de npm dentro de una aplicación React v17.
Este error se activará cada vez que un módulo (o cualquiera de sus propias dependencias) enumere una versión anterior de React como una dependencia del mismo nivel sin incluir también React v17 específicamente .
( Nota: se producirá un comportamiento similar con la actualización de la versión principal de cualquier otro marco o biblioteca).
NPM en sí no enumera los departamentos de pares en las páginas de un módulo determinado. Sin embargo, existe una solución sencilla para verificar las dependencias entre pares, ya sea antes o después de la instalación. Simplemente ejecute:
npm info name-of-module peerDependencies
Este comando devolverá el nombre de cada peerDependency junto con todas las versiones compatibles.
--legacy-peer-deps
a su instalación de npm evitará la instalación automática de peerDependency, pero esto puede generar conflictos debido a cambios potencialmente importantesAsí es como resolví este problema:
Primero, lo que sucede: react-hook-mousetrap busca react@16.8.0, pero no lo encuentra. En su lugar, está encontrando @react17.0.1, que es una versión más nueva. Por alguna razón, a mousetrap no le gusta esta nueva versión, y se le está notificando (no es gran cosa, pero decidieron que valía la pena detener su compilación).
Una solución: instale a la fuerza la versión específica de reaccionar que quiere mousetrap:
yarn add react@16.8.0
Lo que esto hace es revertir su versión de reacción a una un poco más antigua que sea compatible con la trampa para ratones. No notará ninguna diferencia, y en futuras iteraciones, esperemos que se actualice la trampa para ratones, para que esto desaparezca.
Otra solución: tome la decisión radical de no instalar ninguna dependencia de versión anterior:
npm add xxxx --legacy-peer-deps
Lo que esto hace es ignorar las antiguas dependencias de este paquete. Es más completo y toma muchas decisiones por usted.
Si no desea bloquear la instalación de dependencias anteriores, puede hacer que npm ignore esas advertencias forzando el script que está ejecutando. --force