Как NPM обрабатывает конфликты версий?

Опубликовано: 26 Июля, 2021

Рассмотрим случай, когда мы установили модуль, скажем A. Теперь мы хотим установить другой модуль с именем B, и B зависит от A, но проблема в том, что версия A, которая требуется для модуля B, отличается от версии A, установленной сначала. . Итак, как npm справится с ситуацией, когда наше приложение зависит от двух разных версий модуля A. Именно здесь возникают конфликты версий. Проблему можно представить следующим образом.

На изображении выше мы видим, что модуль B зависит от версии 2 модуля A, но в приложении уже есть модуль A с версией 1 в корне.

Давайте разберемся в этом шаг за шагом на следующих примерах:

Случай 1: Оба модуля A и B не имеют зависимости.

В этом случае npm просто добавит модули как корневые зависимости в node_modules . Дерево зависимостей можно представить в виде:

Случай 2: модуль A не имеет зависимости, а модуль B зависит от той же версии A.

В этом случае конструкция останется такой же, как была раньше. NPM не будет повторно устанавливать модуль A той же версии как зависимость B. Следовательно, модуль A будет объединен только один раз. Дерево зависимостей будет таким же, как и в предыдущем случае.

Случай 3: модуль A не имеет зависимости, а модуль B зависит от другой версии A.

Npm устанавливает зависимости в том порядке, в котором они перечислены в файле package.json. Таким образом, он сначала обнаружит модуль A (версия 1) и установит его как корневую зависимость в node_modules. Теперь, когда npm устанавливает модуль B, он проверяет, установлены ли уже зависимости модуля B как корневые или нет. Если они уже установлены в node_modules, npm пропустит установку этих зависимостей. Но в этом случае для модуля B требуется другая версия модуля A, и первая версия A уже существует как корневая зависимость, поэтому npm установит модуль A (версия 2) как зависимость модуля B, что означает, что модуль B будет иметь свою собственная копия node_modules, под которой будет указана вторая версия A. На выходе будут существовать обе версии модуля A. Дерево зависимостей можно представить следующим образом:

Случай 4: Модуль A не имеет зависимости, а модули B и C зависят от версии 2 модуля A.

Теперь в этом случае npm сначала установит модуль A (версия 1) в качестве корневой зависимости в node_modules. Модули B и C будут иметь свои собственные копии node_modules, в которых будет указан модуль A (версия 2). Следует отметить, что модуль вывода A (версия 2) будет объединен дважды, потому что он присутствует как зависимость B и C по отдельности. Из-за этого выходной комплект должен включать несколько копий одной и той же версии одного и того же модуля. Дерево зависимостей будет выглядеть так:

Вот как npm обрабатывает конфликты версий, создавая отдельные копии node_modules для каждой зависимости.

Ссылка: http://npm.github.io/how-npm-works-docs/npm3/how-npm3-works.html