Что действительно делает «Связывание зависимостей» во время установки npm / yarn? - PullRequest
0 голосов
/ 04 июня 2018

Для больших веб-приложений npm install соотв.yarn install занимает много времени, в основном на этапе, называемом Linking Dependencies.Что здесь происходит?Это получение зависимостей зависимостей?Или что-то совершенно другое?Какие файлы создаются на этом этапе?

Ответы [ 2 ]

0 голосов
/ 14 июня 2018

Когда вы звоните yarn install, происходит следующее:

  1. Разрешение : пряжа начинает разрешать зависимости, отправляя запросы в реестр и рекурсивно просматриваядо каждой зависимости.

  2. Загрузка / извлечение : Затем Yarn просматривает каталог глобального кэша, чтобы узнать, был ли уже загружен необходимый пакет.Если этого не произошло, Yarn извлекает архив для пакета и помещает его в глобальный кеш, чтобы он мог работать в автономном режиме и не нуждался в загрузке зависимостей более одного раза.Зависимости также могут быть помещены в систему управления версиями в виде архивов для полной автономной установки.

  3. Связывание : Наконец, Yarn связывает все вместе, копируя все файлы, необходимые из глобальногокэшируйте в локальный каталог node_modules после определения того, что уже есть, а что нет.


yarn install действительно занимает много времени, в основном на этапе, называемом Linking Dependencies

Вы должны заметить, что Step 3: Linking занимает больше времени, чем Step 1: Resolution и Step 2: Fetching, когда происходит фактическая загрузка.Во время этого шага у нас уже есть вещи, которые нам нужно подготовить и загрузить, тогда почему это занимает много времени, мы что-то упустили?

Да, COPY для локального проекта в папку node_modules ...!Причина этого заключается в том, что эта копия не эквивалентна копированию одного большого файла ISO размером 4,7 ГБ.Вместо этого это несколько очень маленьких файлов (не принимайте это во внимание, когда я говорю «несколько», это может быть 15k + файлов: P), поэтому копирование занимает много времени.(Также важно отметить, что при загрузке пакетов вы загружаете один большой файл tar на пакет, содержимое которого затем должно быть извлечено в кэш, что также занимает время)

Это медленнее из-за

  • Антивирус : Ваш антивирус сидит посередине и выполняет быструю проверку (в дополнение к нашей проверке пряжи, если она уже существует) на каждомПряжа одного файла пытается скопировать сокращение скорости на столько.Если вы работаете в Windows, попробуйте добавить родительскую папку своего проекта в качестве исключения в Защитник Windows.
  • Скорость передачи данных на носителе : твердотельные накопители могут значительно увеличить эту скорость (извините, SSHD и FireCudas не помогутлибо это будет один раз).

Но так ли это эффективно?Могу ли я получить его из глобальных node_modules (после создания)?

Нет для обоих вопросов.Из-за того, как работает узел, каждый пакет находит свои зависимости только относительно своего собственного местоположения.Кроме того, поскольку каждый проект может использовать разные версии одного и того же пакета, чтобы обеспечить его правильную работу и не нарушать обновления пакета.

В идеале папка проекта должна быть компактной.Эффективный способ сделать это - иметь папку global node_modules.Любые и все запрошенные пакеты загружаются, если их еще нет, И используются из этого местоположения.На самом деле Ruby делает это так.Вот мой глобальный Ruby эквивалент папки node_modules.Обратите внимание на наличие разных версий одного и того же пакета для использования в разных проектах.

enter image description here

Но имейте в виду, что это снизит переносимость проекта.Это компромисс, который должен сделать любой менеджер (будь то рубины или модули узлов).Я могу просто скопировать папку проекта узла (что на самом деле может занять несколько часов, потому что вы также будете копировать (локальную) папку node_modules, но я могу ожидать, что она будет работать, если у меня будет только эта папка проекта, а не копированиеПроект ruby ​​будет занимать от нескольких секунд до нескольких минут, поскольку нет папки локальных пакетов (или gems, как они их называют), но при запуске проекта в другой системе эти пакеты должны присутствовать в глобальной папке gems.

0 голосов
/ 13 июня 2018

Фаза связывания работает в основном за 3 больших шага:

  1. Найдите каждый файл, который должен быть в node_modules
  2. Проверьте этот список по сравнению с тем, что уже есть, и найдите, что нужнокопироваться из кэша в node_modules
  3. Сделать копию

Возможно, эта проблема на Github поможет вам.

https://github.com/yarnpkg/yarn/issues/1496

...