В настоящее время я пытаюсь выяснить, как угловая сборка CLI обрабатывает зависимости npm. Я использую угловой CLI 1.4.5 и npm 5.6.0.
Чтобы подвести итоги теста:
Допустим, в моем package.json у меня есть две зависимости: libA и libB, но у libB есть зависимость libA в своем собственном package.json.
package.json моего приложения будет выглядеть так
... "зависимости": {
"libA": "2.0",
"libB": "2.0"
} ...
package.json в libB будет выглядеть так:
... "зависимости": {
"libA": "1.0"
} ...
После установки npm дерево зависимостей выглядит следующим образом (libA устанавливается в двух местах в папке node_modules - на «верхнем уровне» с версией 2.0 - и в папке libB node_modules с версией 1.0):
--libA@2.0
--libB@2.0
|
--libA@1.0
Хорошо, пока все хорошо, я понимаю, как и почему npm делает это.
Теперь в моем приложении я использую угловой компонент из libB (назовем этот компонентB), который сам использует компонент из libA (назовем этот компонент componentA).
Предположим, что разница между libA@2.0 и libA@1.0 составляет всего одну строку кода в файле ts компонента A (то, что мы можем использовать для различия между ними, например, console.log для определенного события, которое печатает «используется libA@1.0» или «используется libA@2.0»).
Случай 1: я строю свой проект с помощью "ng build"
Я проверяю свой компонентB в браузере => Я получаю журнал консоли "libA@1.0 is used". Это то, что я ожидал, и для меня имеет смысл, что npm устанавливает libA@1.0 для использования компонентами в libB.
Случай 2: я строю свой проект с помощью "ng build --prod"
В этом случае, когда я тестирую свой компонент B в браузере =>, я получаю журнал консоли «libA@2.0 is used».
Глядя в файл vendor.bundle.js, я вижу два определения для компонента A - я бы сказал, что это ожидалось (по одному для каждой версии libA). Но я также ожидал, что пакет (каким-то образом, не уверен, как) сохранит зависимости в дереве зависимостей npm (и получит консольный журнал "libA@1.0 used").
Кто-нибудь знает, как это работает более подробно? Код libA@1.0 и libA@2.0 только что добавлен в vendor.bundle.js? Как вы можете сказать, какой из них будет использоваться?
Я также должен упомянуть, что libA и libB являются пользовательскими угловыми библиотеками. LibA - это «основная» библиотека. LibB построен с использованием компонентов из libA (в основном, немых компонентов).