npm vs Yarn — какой менеджер пакетов стоит использовать ?

Npm и Yarn – два самых популярных менеджеры пакетов для JavaScript. Если вы не знаете что делают менеджеры пакетов, то они являются естественным способом автоматизации процесса установки, обновления и удаления сторонних модулей, которые хранятся в общей базе модулей. В этой статье будет рассказано в чем разница между двумя самыми популярными менеджерами пакетов для JavaScript – npm и Yarn.

Что такое npm ?

Npm – это менеджер пакетов, входящий в состав Node.js. Он использует клиент командной строки и базу данных, состоящую из общедоступных и приватных пакетов, известной как npm registry. Пользователи могут получить доступ к базе через сайт или через консоль.

Что такое Yarn ?

Yarn был разработан в Facebook чтобы избавится от недостатков npm. Технически Yarn не является заменой npm, так он берет информацию про модули из базы npm. По сути Yarn это новый установщик который по прежнему базируется на структуре заданной npm. В Yarn доступны все те же пакеты что и в npm, поэтому, переезд с npm на Yarn не требует больших усилий.

Как установить npm

npm распространяется вместе с Node.js, то есть если вы установили Node.js, вы автоматически установили npm. Для проверки успешной установки Node.js используйте следующие команды

$ node -v
v8.2.1
$ npm -v
5.3.0

Как установить Yarn

Есть два способа: через npm, для этого запустите следующую команду

npm install yarn –global

Хотя некоторые программисты не советуют так делать, так как считают что лучше установить Yarn через менеджер пакетов операционной системы. Например если вы используете brew на Mac, запустите следующую команду:

brew update
brew install yarn

Для установки Yarn на Ubuntu 16.04 запустите такие команды:

curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add –
echo “deb https://dl.yarnpkg.com/debian/ stable main” | sudo tee /etc/apt/sources.list.d/yarn.list
sudo apt-get update && sudo apt-get install yarn

Сравнение Yarn vs npm

Yarn имеет несколько особенностей отличающих его от npm (особенно версии меньше 5.0:

Наличие yarn.lock файла

Управления версиями в файле ‘package.json’ иногда становится беспорядочным. Файл yarn.lock помогает упорядочить эту путаницу. При добавлении новой зависимости, Yarn обновляет yarn.lock файл, принцип работы похож на Gemfile.lock в Ruby. yarn.lock файл гарантирует что на каждом устройстве будет установлена одинаковая версия пакета. lock файлы так называются, потому что они фиксируют версии зависимостей во время их установки. lockfile состоит из отсортированных ключей чтобы гарантировать минимальный изменения в файловой структуре папки node_modules.

В более ранних версиях npm, такая функциональность была реализована с помощью команды упаковывания(npm shrinkwrap). Тем не менее, shrinkwrap файл не генерировался автоматически, и требовал постоянной поддержки и обновления. Чтобы решить эту проблему npm ввел package-lock.json

Процесс установки пакетов

При установки пакета npm выполняет необходимые действия последовательно, в том смысле что каждый пакет должен полностью установится по очереди. Yarn в свою очередь производит несколько установок за один шаг, что делает процесс установки зависимостей менее длительным.

Скорость

Yarn на порядок быстрее всех версий npm меньше 5.0. Когда команда npm выпустила 5 версию они заявили что она будет в пять раз быстрее своих предшественников. Но все же npm остался медленне чем Yarn []

Безопасность

Главная проблема npm, это то что он автоматически запускает код зависимостей и позволяет добавлять зависимости на лету, хотя такие особенности дают много преимуществ, они также создаю уязвимости в безопасности. Так как Yarn устанавливает зависимости только с файлов yarn.lock или package.json он считается более безопасным. Также Yarn проверяет контрольные суммы перед установкой чтобы гарантировать целостность каждого пакета.

Разница при выполнении команд

Кроме своих функциональных преимуществ, Yarn также имеет несколько новых полезных команд.

Установка зависимостей

npm install устанавливает зависимости с файла package.json. Команда yarn install – с файла yarn.lock.

yarn why

Если вам не понятно почему именно этот пакет установился, команда yarn why пройдется по графу зависимостей и поможет вам выяснить.

Добавления пакетов

Команда yarn add <package> позволяет добавлять зависимости также как команда npm install <package>, но также добавляет зависимость в package.json.

Обновления пакетов

Также как и pm update, команда yarn upgrade [package] обновляет версии пакетов до последних версий.

yarn generate-lock-entry

Если вам нужно вручную сгенерировать файл yarn.lock, базируясь на зависимостях из package.json, используйте команду yarn generate-lock-entry. По сути это команда npm shrinkwrap, но ее нужно использовать очень аккуратно потому что файл yarn.lock, перезаписывается каждый раз при установке новой зависимости.

Улучшения npm в версии 5.0

В релиз пятой версии npm было добавлено три весомых улучшения:

1. Сохранения версий: был добавлен package-lock.json файл, и убрана команда npm-shrinkwrap. Это помогло решить проблемы с версиями зависимостей между установками на разных устройствах.

2. Улучшена производительность: npm 5 быстрее своих предшественников

3. Автоматическое добавление в package.json файл при выполнении команды npm install, в предыдущих версиях приходилась запускать эту команду з флагом –save.

npm vs Yarn: кто более надежен ?

До первого официального релиза Yarn, пользователи жаловались на проблемы с производительностью, но эти проблемы вскоре были решены. Так как Yarn поддерживается такой большой компанией как Facebook, все баги фиксят довольно быстро. По этому Yarn должен быть достаточно стабилен сейчас, но если вы столкнулись с какой то проблемой вы всегда можете вернуться к старому доброму npm.

Недостатки Yarn

Несмотря на то, что Yarn считается улучшенной версией npm, он все же имеет несколько нерешенных проблем. Например, одновременное использование npm и Yarn создает конфликты. Чтобы избежать подобных проблем, рекомендуется разделять проект на модули. Еще одной проблемой является большая необходимость в дисковом пространстве, так как Yarn сохраняет зависимости локально.

Yarn vs npm – вывод

Yarn будет все более популярными благодаря своей хорошей производительности, и многочисленным полезным командам. Тем не менее, npm все еще существует и становится все мощнее с каждой новой версией.

Если вы еще не определились что лучше, попробуйте использовать Yarn вместо npm для вашего следующего проекта и посмотреть, что вам больше по душе. Тем не менее, если вы устали длительного времени ожидания установки npm, то это может быть время, чтобы сделать шаг к Yarn .