January 26, 2022

Yarn vs npm: все, что вам нужно знать

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

Изложение основ

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

Менеджер пакетов - это инструмент, который автоматически обрабатывает зависимости проекта различными способами. Например, с помощью него мы можем устанавливать, удалять, обновлять и модернизировать пакеты, настраивать параметры проекта, запускать скрипты и так далее. Всю тяжелую и утомительную работу делает менеджер пакетов, оставляя нам только самое интересное - само программирование.

npm означает Node Package Manager. Он был представлен в 2010 году, положив начало новой эре в веб-разработке. До этого момента зависимости проекта загружались и управлялись вручную. npm стал волшебной палочкой, которая вывела веб-разработку на новый уровень.

На самом деле npm включает в себя три составляющих:

  • веб-сайт для управления различными аспектами вашей работы с npm
  • реестр для доступа к обширной публичной базе данных пакетов JavaScript
  • интерфейс командной строки (CLI) для взаимодействия с npm через терминал

Однако, когда большинство людей говорят о npm, они обычно имеют в виду последний - инструмент CLI. Он поставляется в качестве менеджера пакетов по умолчанию с каждой новой установкой Node. Это означает, что вы можете начать использовать его сразу же.

Yarn расшифровывается как Yet Another Resource Negotiator. Менеджер пакетов Yarn - это альтернатива npm, выпущенная компанией Facebook в октябре 2016 года. Первоначальной целью создания Yarn было устранение недостатков npm, таких как производительность и проблемы безопасности. Yarn был быстро позиционирован как безопасный, быстрый и надежный инструмент управления зависимостями JavaScript.

Но команда npm извлекла для себя урок и быстро заполнила пробелы в npm, реализовав недостающие функции.

Давайте быстро перенесемся во времени, чтобы увидеть общую картину:

  • 2010: выпущен npm с поддержкой Node.
  • 2016: Выпущен Yarn. Он показывает гораздо большую производительность, чем npm. Он также генерирует файл yarn.lock, который делает совместное использование и точную репликацию репозиториев намного проще и предсказуемее.
  • 2017: Выпущен npm 5. Он предлагает автоматическую генерацию файла package-lock.json в ответ на yarn.lock.
  • 2018: Выпущен npm 6 с улучшенной безопасностью. Теперь npm проверяет уязвимости безопасности перед установкой зависимостей.
  • 2020: Выпущены Yarn 2 и npm 7. Оба пакета имеют новые возможности, которые мы увидим позже в этом руководстве.
  • 2021: Выходит Yarn 3 с различными улучшениями.

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

В оставшейся части этого руководства мы рассмотрим основные сходства и различия между npm и Yarn.

Yarn и npm: сравнение установки

Мы начнем наше сравнительное исследование с процесса установки как npm, так и Yarn.

Установка самих менеджеров пакетов

Как я отметил выше, npm поставляется с предустановленным Node, поэтому нет необходимости устанавливать npm вручную.

В отличие от этого, Yarn нужно устанавливать отдельно. Во-первых, нам нужно установить Yarn глобально:

npm install -g yarn

Затем мы можем использовать его для каждого проекта, установив нужную версию внутри нашего проекта. Для этого нужно выполнить команду yarn set version в корневом каталоге проекта:

yarn set version berry

В данном случае berry - это версия, которую мы хотим установить.

Если мы хотим обновить версию до последней, мы выполним следующее:

yarn set version latest

С Yarn мы можем использовать разные версии для каждого проекта.

Чтобы сделать то же самое с npm, вам потребуется установить nvm (Node Version Manager).

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

Теперь давайте посмотрим, как устанавливаются зависимости проекта.

Когда мы запускаем npm install, зависимости устанавливаются последовательно, одна за другой. Логи вывода в терминале информативны, но немного трудночитаемы.

Чтобы установить пакеты с помощью Yarn, мы выполняем команду yarn. Yarn устанавливает пакеты параллельно, что является одной из причин, почему он быстрее, чем npm. Если вы используете Yarn 1, вы увидите, что журналы вывода yarn чистые, визуально различимые и краткие. Они также упорядочены в виде дерева для удобства восприятия. Но это меняется в версиях 2 и 3, где журналы не такие интуитивно понятные и человекочитаемые.

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

Сравнение команд npm и Yarn

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

  • npm init | yarn init: создание нового пакета
  • npm run | yarn run: запуск скрипта, определенного в package.json
  • npm test | yarn test: тестирование пакета
  • npm publish | yarn publish: опубликовать пакет
  • npm cache clean | yarn cache clean: удалить все данные из папки cache

Эти команды упрощают переключение между двумя менеджерами, но есть некоторые неидентичные команды, которые могут вызвать путаницу. Давайте посмотрим, что это за команды в следующем списке:

  • npm install | yarn: установка зависимостей
  • npm install [package] | yarn add [package]: установка пакета
  • npm install --save-dev [package] | yarn add - -dev [package]: установка пакета в качестве зависимости для разработки
  • npm uninstall [package] | yarn remove [package]: удаление пакета
  • npm uninstall --save-dev [package] | yarn remove [package]: удаление пакета, зависящего от разработки
  • npm update | yarn upgrade: обновление зависимостей
  • npm update [package] | yarn upgrade [package]: обновление пакета

В Yarn также есть несколько уникальных команд, которые не имеют аналогов в npm. Например, команда why отображает причину необходимости пакета: это может быть зависимость, нативный модуль или зависимость от проекта.

Yarn против npm: скорость и производительность

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

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

Несмотря на то, что Yarn имеет некоторые преимущества, скорости Yarn и npm в их последних версиях вполне сопоставимы. Поэтому мы не можем определить победителя.

Yarn vs npm: сравнение безопасности

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

Начиная с версии 6, npm проверяет пакеты во время установки и сообщает вам, если обнаружены какие-либо уязвимости. Мы можем выполнить эту проверку вручную, запустив npm audit для установленных пакетов. Если будут найдены уязвимости, npm даст нам рекомендации по безопасности.

Как видно на скриншоте выше, мы можем запустить npm audit fix для устранения уязвимостей пакетов, и деревья зависимостей будут исправлены, если это возможно.

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

Yarn vs npm: сравнение возможностей

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

Создание файла блокировки

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

В идеальном мире семантического версионирования исправленные релизы не будут содержать никаких ломающих изменений. Но, к сожалению, это не всегда так. Стратегия, используемая npm, может привести к тому, что на двух компьютерах окажется один и тот же файл package.json, но будут установлены разные версии пакета, что, возможно, приведет к появлению ошибок.

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

Использование рабочих областей

Рабочие пространства позволяют вам иметь один монорепо для управления зависимостями в нескольких проектах. Это означает, что у вас есть один корневой пакет верхнего уровня, который имеет несколько дочерних пакетов, называемых рабочими пространствами.

Удаленный запуск скриптов

Команда npx используется для запуска скриптов из ./node_modules/.bin. Она также позволяет выполнять пакеты из реестра npm, не устанавливая их в зависимости вашего проекта. Например, вы можете создать новое приложение React, выполнив следующее:

npx create-react-app my-app

В Yarn вы можете достичь того же результата, используя эквивалентную команду dlx:

yarn dlx create-react-app my-app

Остальные функции, которые мы будем изучать, уникальны для Yarn.

Нулевые установки

При нулевой установке кэш хранится в каталоге вашего проекта в папке .yarn. Когда вы используете такие команды, как yarn или yarn add <package>, Yarn создаст файл .pnp.cjs. Этот файл содержит иерархию зависимостей, используемую Node для загрузки пакетов вашего проекта. Таким образом, вы можете получить к ним доступ практически в нулевое время.

Plug'n'Play (Подключи и работай)

Plug'n'Play - это альтернативная стратегия установки. Вместо того чтобы генерировать каталог node_modules и оставлять решение проблемы на усмотрение Node, Yarn генерирует единственный файл .pnp.cjs, который сопоставляет пакеты с их расположением на диске и списком зависимостей. Эта возможность может привести к более быстрому запуску проекта, лучшей оптимизации дерева зависимостей, более быстрому времени установки и, конечно, устраняет необходимость в папке node_modules.

Лицензия

В Yarn встроена функция проверки лицензий, которая может быть полезна в различных случаях при разработке приложений.

Yarn vs npm: какой менеджер пакетов выбрать

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

В качестве общего руководства позвольте мне в заключение дать следующий совет:

  • Выбирайте npm, если вас устраивает ваш текущий рабочий процесс, вы не хотите устанавливать дополнительный инструмент и у вас мало места на диске.
  • Выбирайте Yarn, если вам нужны такие замечательные возможности, как Plug'n'Play, вам нужна функциональность, которой не хватает в npm, и у вас достаточно места на диске.

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

Заключение

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

И, наконец, не раздумывайте. Просто выберите один из них и переходите к самому интересному: созданию отличных приложений!

Источник: https://www.sitepoint.com/yarn-vs-npm/