Ответ 1
Были времена, когда у нас был только npm
, но у него было так много проблем с разрешением зависимостей и кэшированием, что появился другой инструмент (yarn
). Обычно для разрешения зависимостей использовался локальный кэш, и это было важно, например, при выполнении заданий CI, которые почти всегда выполняются в одной и той же среде, а высокая пропускная способность обходится дорого, поскольку вы платите за данные в облачных сервисах. Это означает, что в старых версиях npm
, когда вы запускали npm install
, и у вас был доступ в deps
Первая нота
Пожалуйста, поймите, что yarn
был построен поверх пакетов npm
, и https://www.npmjs.com/ это означает, что они оба используют реестр NPM
для разрешения пакетов. поэтому, если вы запустите npm install [email protected]
или yarn add [email protected]
, вы получите тот же результат
Инкрементная установка
[email protected]
При каждой новой сборке обе зависимости снова загружались из Интернета. Yarn использует yarn.lock
и сравнивает ваш файл package.json
с yarn.lock
и определяет, какие пакеты необходимо извлечь дополнительно, чтобы только постепенно устанавливать новые зависимости
Многопоточность
yarn
предлагает параллельную установку пакетов, которые не зависят от потоков. Это может снизить время установки до 1/10 времени от npm install
Блокировка версий
Как было сказано ранее, yarn
генерирует yarn.lock
после каждой установки, в которой сохраняются ВСЕ версии установленных пакетов (как вы, вероятно, знаете, у пакета могут быть зависимости, и у зависимости также могут быть свои собственные зависимости), поэтому он может создавать бесконечное дерево зависимостей, которое может привести к очень плохим конфликтам. Давайте представим этот сценарий
- lodash^1
- [email protected]
- - [email protected]
- [email protected]
- - [email protected]
Представьте себе сценарий, когда сопровождающий another_module
решает поднять lodash до критической версии изменений 1.2.0
, что может случиться с тем, что npm
в старые времена могли получать 2 разных экземпляра одной библиотеки и 2 разные версии, которые могли привести к очень странное поведение Потому что, поскольку у вас нет точной блокировки в вашем модуле (вы принимаете любую полуверсионную версию ^ 1.xx и ^ 2.xx, так что это означает, что оба подмодуля будут удовлетворять вашим требованиям, но выбирают другую версию. Пряжа заблокирует ваш yarn.lock
AT ВРЕМЯ ДОБАВЛЕНИЯ нового пакета в проект, это означает, что когда другие разработчики в вашем проекте извлекут проект, у него также будут те же yarn.lock
и yarn
, в конечном счете, "имитировать" состояние пакета, как они были установлены, когда вы совершенный yarn.lock
с другой стороны NPM
просто смотрит на удовлетворение полузащиты и может получить 2 разные версии для 2 разработчиков (при условии, что со временем пакеты обновляются)
Конечная нота
Ребята из npm
проделали большую работу, когда они выпустили [email protected]
, и я думаю, что все заявления теперь являются просто причинами, по которым yarn
был создан и какие проблемы он решал в то время, но я думаю, что на сегодняшний день, между этими двумя в настоящее время нет большой разницы