Как угловая CLI prod build управляет вложенными зависимостями npm?сборка против разработки - PullRequest
0 голосов
/ 16 апреля 2019

В настоящее время я пытаюсь выяснить, как угловая сборка 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 (в основном, немых компонентов).

...