Considere un caso en el que hemos instalado un módulo, digamos A. Ahora queremos instalar otro módulo llamado B y B depende de A, pero el problema es que la versión de A que requiere el módulo B es diferente de la versión de A instalada al principio. . Entonces, ¿cómo manejará npm esta situación en la que nuestra aplicación depende de dos versiones diferentes del módulo A? Aquí es donde surgen los conflictos de versión. El problema se puede representar de la siguiente manera.
En la imagen de arriba, podemos ver que el módulo B depende de la versión 2 del módulo A, pero la aplicación ya tiene el módulo A con la versión 1 en su raíz.
Entendamos esto paso a paso tomando los siguientes casos:
Caso 1: Ambos módulos A y B no tienen ninguna dependencia.
En este caso, npm simplemente agregaría los módulos como dependencia raíz en node_modules . El árbol de dependencia se puede representar como:
Caso 2: el módulo A no tiene dependencia y el módulo B depende de la misma versión de A.
En este caso, la estructura seguirá siendo la misma que antes. NPM no volvería a instalar el módulo A de la misma versión como una dependencia de B. Por lo tanto, el módulo A solo se empaquetará una vez. El árbol de dependencias será el mismo que en el caso anterior.
Caso 3: el módulo A no tiene dependencia y el módulo B depende de la versión diferente de A.
Npm instala las dependencias en el orden en que aparecen en el archivo package.json. Por lo tanto, primero encontrará el módulo A (versión 1) y lo instalará como dependencia raíz en node_modules. Ahora, cuando npm está instalando el módulo B, comprueba si las dependencias del módulo B ya están instaladas como dependencias raíz o no. Si ya están instalados en node_modules, npm omitiría la instalación de esas dependencias. Pero en este caso, se requiere una versión diferente del módulo A para el módulo B y la primera versión de A ya existe como dependencia raíz, por lo que npm instalaría el módulo A (versión 2) como una dependencia del módulo B, lo que significa que el módulo B tendrá su propia copia de node_modules bajo la cual se listará la segunda versión de A. En la salida, existirán ambas versiones del módulo A. El árbol de dependencia se puede representar de la siguiente manera:
Caso 4: el módulo A no tiene dependencia y los módulos B y C dependen de la versión 2 del módulo A.
Ahora, en este caso, npm primero instalará el módulo A (versión 1) como dependencia raíz en node_modules. Los módulos B y C tendrán sus propias copias de node_modules bajo las cuales se enumerará el módulo A (versión 2). Lo que debe notarse es que en el módulo de salida A (versión 2) se empaquetará dos veces porque está presente como una dependencia de B y C por separado. Debido a esto, el paquete de salida debe incluir varias copias de la misma versión del mismo módulo. El árbol de dependencia se verá así:
Así es como npm maneja los conflictos de versión haciendo copias separadas de node_modules para cada dependencia.
Referencia: http://npm.github.io/how-npm-works-docs/npm3/how-npm3-works.html
Publicación traducida automáticamente
Artículo escrito por pritishnagpal y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA