Facebook и Google — самые известные имена, стоящие за созданием и выпуском нового диспетчера пакетов JavaScript с открытым исходным кодом Yarn, который предназначен для замены диспетчера пакетов npm.
Кажется, только вчера программы JavaScript состояли максимум из нескольких сотен строк, а использование пакета означало загрузку чего-либо из CDN. Node.js изменил все это и превратил JavaScript в язык на стороне сервера, который используется в действительно больших проектах.
Текущее решение для управления тысячами доступных пакетов JavaScript — это npm, клиент для которого автоматически включается в Node.js. Разработчики Facebook, работающие над большими проектами, такими как React, обнаружили, что работа с клиентом npm просто не масштабируется до количества программистов и количества пакетов. Решением было объединиться с Google, Exponent и Tilde и создать новый клиент npm — чем и является Yarn.
Так чем же отличается Yarn?
В сообщении блога Facebook, посвященном этому, говорится:
В экосистеме Node зависимости помещаются в каталог node_modules вашего проекта. Однако эта файловая структура может отличаться от фактического дерева зависимостей, поскольку повторяющиеся зависимости объединяются вместе. Клиент npm недетерминированно устанавливает зависимости в каталог node_modules. Это означает, что в зависимости от порядка установки зависимостей структура каталога anode_modules может отличаться от одного человека к другому. Эти различия могут привести к появлению ошибок типа «работает на моей машине», на поиск которых потребуется много времени.
Yarn решает эти проблемы, связанные с управлением версиями и недетерминизмом, с помощью файлов блокировки и алгоритма установки, который является детерминированным и надежным. Эти файлы блокировки блокируют установленные зависимости для определенной версии и гарантируют, что каждая установка приводит к точно такой же файловой структуре в node_modules на всех машинах. В письменном файле блокировки используется сжатый формат с упорядоченными ключами, чтобы гарантировать минимальные изменения и простоту просмотра.
То, что диспетчер пакетов должен реализовывать детерминированные установки, кажется меньшим, о чем вы могли бы спросить, но похоже, что клиент npm не детерминирован.
Yarn может использовать реестр npm для получения пакетов, но после получения пакета он кэшируется. Это означает, что вы можете установить его локально без необходимости подключения к Интернету, и постепенно ваша зависимость от реестра npm уменьшится.
Ирония заключается в том, что для установки Yarn вам нужно использовать клиент npm, который он затем заменяет, что напоминает идею о том, что единственное использование IE — это установка другого браузера. Однако здесь есть серьезная проблема. Неясно, может ли Yarn заменить или стать ответвлением реестра npm. В настоящий момент Yarn обращается к реестру, предоставленному Npmjs.com, но он не аутентифицируется и поэтому не может работать с частными пакетами.
В реестре размещаются частные пакеты по цене около 7 долларов в месяц на программиста; бесплатно только хостинг и загрузка пакетов с открытым исходным кодом. Понятно, что когда-нибудь в будущем спин-офф Yarn (попытка каламбура) сможет создать собственное частное пакетное оборудование.