Как поменять yarn на npm
Перейти к содержимому

Как поменять yarn на npm

  • автор:

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

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

  • установка пакетов не была достаточно быстрой и последовательной;
  • существовали проблемы с безопасностью, так как npm позволяет пакетам запускать код при установке.

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

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

логотип Yarn

Yarn или npm: функциональные отличия

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

Файл yarn.lock

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

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

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

В npm команда npm shrinkwrap так же генерирует файл блокировки, а команда npm install считывает его до чтения package.json , также как Yarn сначала читает yarn.lock . Разница состоит в том, что Yarn всегда автоматически обновляет yarn.lock , а в npm это надо делать вручную.

  1. документация yarn.lock
  2. документация npm shrinkwrap

Параллельная установка

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

Для сравнения я установил пакет express с помощью npm и Yarn, не используя кэш, файлы shrinkwrap или lock; всего в установке 42 файла.

  • npm: 9 секунд
  • Yarn: 1.37 секунд

Я не поверил своим глазам. Повторение дало такие же результаты. Затем я установил gulp со 195 зависимостями.

  • npm: 11 секунд
  • Yarn: 7.81 секунд

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

Консольные логи

По умолчанию npm выводит очень много. Например, он рекурсивно перечисляет все установленные пакеты при выполнении npm install . Yarn с другой стороны, обходится минимумом информации и использует эмодзи (если у вас mac).

Вывод yarn в консоль

Yarn или npm: различия в интерфейсе командной строки

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

yarn global

В отличие от npm, где глобальные операции выполняются за счет опции -g или —global , команды Yarn нуждаются в префиксе global . Также как и в npm, специфические для проекта зависимости глобально не устанавливаются.

Префикс global работает только с командами yarn add , yarn bin , yarn ls и yarn remove . За исключением yarn add , все эти команды идентичны своим эквивалентам в npm.

yarn install

Команда npm install устанавливает все зависимости из файла package.json и позволяет вам добавлять новые пакеты. Команда yarn install только устанавливает зависимости, перечисленные в файле yarn.lock или package.json , именно в таком порядке.

  1. Документация yarn install
  2. Документация npm install

yarn add [–dev]

Аналогично npm install , команда yarn add добавляет пакет и устанавливает зависимости. Как видно из названия команды, она добавляет зависимости, это означает автоматическое сохранение ссылки на пакет в файле package.json , также как это делается в npm с флагом —save . Флаг —dev в Yarn добавляет зависимости для разработки, также как флаг —save-dev в npm.

  1. Документация yarn add
  2. Документация npm install

yarn licenses [ls|generate-disclaimer]

На момент написания в npm нет эквивалента этой команды. Yarn licenses ls выводит список лицензий всех установленных в проекте пакетов, а yarn licenses generate-disclaimer генерирует дисклеймер, содержащий текст всех лицензий всех пакетов в проекте. Некоторые лицензии требуют включать текст лицензии в ваш проект, поэтому этот инструмент весьма полезен.

yarn why

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

yarn upgrade

Эта команда обновляет пакеты до последней версии, соответствующей диапазону из package.json вместо установки точных версий из yarn.lock . Чтобы добиться того же в npm, вам надо последовательно выполнить:

rm -rf node_modules npm install 

Эту команду не надо путать с npm update, обновляющей пакеты до самой свежей версии.

yarn generate-lock-entry

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

  1. Документация yarn generate-lock-entry
  2. Документация npm shrinkwrap

Стабильность и надежность

А что, если шумиха вокруг Yarn преждевременна? В первый же день релиза появилось много сообщений о проблемах, но темпы решения проблем поражают. Это показывает серьезную работу по обнаружению и исправлению багов. Если смотреть на количество и типы проблем, Yarn кажется стабильным для большинства пользователей, но он может не подойти для каких-то отдельных случаев.

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

Перспективы

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

Я вижу схожие паттерны между npm и Yarn. Хотя Yarn это не форк, он исправляет некоторые из недостатков npm. Разве будет плохо, если npm учтет это и попросит Facebook, Google и остальных разработчиков Yarn улучшить npm? Хотя об этом слишком рано пока говорить, но я надеюсь, что так и произойдет.

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

Заключение

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

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

Если же вы замечали, что вам приходиться ждать окончания установки пакетов npm, то вам самое время ознакомиться с руководством по переходу на Yarn.

yarn set version

Download the latest release from the Yarn repository :

yarn set version latest

Download the latest canary release from the Yarn repository :

yarn set version canary

Download the latest classic release from the Yarn repository :

yarn set version classic

Download the most recent Yarn 3 build :

Download a specific Yarn 2 build :

yarn set version 2.0.0-rc.30

Switch back to a specific Yarn 1 release :

yarn set version 1.22.1

Use a release from the local filesystem :

yarn set version ./yarn.cjs

Use a release from a URL :

yarn set version https://repo.yarnpkg.com/3.1.0/packages/yarnpkg-cli/bin/yarn.js

Download the version used to invoke the command :

yarn set version self

Details

This command will set a specific release of Yarn to be used by Corepack: https://nodejs.org/api/corepack.html.

By default it only will set the packageManager field at the root of your project, but if the referenced release cannot be represented this way, if you already have yarnPath configured, or if you set the —yarn-path command line flag, then the release will also be downloaded from the Yarn GitHub repository, stored inside your project, and referenced via the yarnPath settings from your project .yarnrc.yml file.

A very good use case for this command is to enforce the version of Yarn used by any single member of your team inside the same project — by doing this you ensure that you have control over Yarn upgrades and downgrades (including on your deployment servers), and get rid of most of the headaches related to someone using a slightly different version and getting different behavior.

The version specifier can be:

  • a tag:
    • latest / berry / stable -> the most recent stable berry ( >=2.0.0 ) release
    • canary -> the most recent canary (release candidate) berry ( >=2.0.0 ) release
    • classic -> the most recent classic ( ^0.x || ^1.x ) release

    Migrating from npm

    Migrating from npm should be a fairly easy process for most users. Yarn can consume the same package.json format as npm, and can install any package from the npm registry.

    If you want to try Yarn out on your existing npm project, just try running:

    yarn 

    This will lay out your node_modules folder using Yarn’s resolution algorithm that is compatible with the node.js module resolution algorithm.

    If you get an error, please check for an existing issue or report it to the Yarn issue tracker.

    When you run either yarn or yarn add , Yarn will generate a yarn.lock file within the root directory of your package. You don’t need to read or understand this file — just check it into source control. When other people start using Yarn instead of npm , the yarn.lock file will ensure that they get precisely the same dependencies as you have.

    In most cases, running yarn or yarn add for the first time will just work. In some cases, the information in a package.json file is not explicit enough to eliminate dependencies, and the deterministic way that Yarn chooses dependencies will run into dependency conflicts. This is especially likely to happen in larger projects where sometimes npm install does not work and developers are frequently removing node_modules and rebuilding from scratch. If this happens, try using npm to make the versions of dependencies more explicit, before converting to Yarn.

    As of Yarn 1.7.0, you can import your package-lock.json state, generated by npm to Yarn, by using yarn import .

    Other developers on the project can keep using npm , so you don’t need to get everyone on your project to convert at the same time. The developers using yarn will all get exactly the same configuration as each other, and the developers using npm may get slightly different configurations, which is the intended behavior of npm .

    Later, if you decide that Yarn is not for you, you can just go back to using npm without making any particular changes. You can delete your old yarn.lock file if nobody on the project is using Yarn any more but it’s not necessary.

    If you are using an npm-shrinkwrap.json file right now, be aware that you may end up with a different set of dependencies. Yarn does not support npm shrinkwrap files as they don’t have enough information in them to power Yarn’s more deterministic algorithm. If you are using a shrinkwrap file it may be easier to convert everyone working on the project to use Yarn at the same time. Simply remove your existing npm-shrinkwrap.json file and check in the newly created yarn.lock file.

    CLI commands comparison

    npm (v5) Yarn
    npm install yarn add
    (N/A) yarn add —flat
    (N/A) yarn add —har
    npm install —no-package-lock yarn add —no-lockfile
    (N/A) yarn add —pure-lockfile
    npm install [package] —save yarn add [package]
    npm install [package] —save-dev yarn add [package] —dev
    (N/A) yarn add [package] —peer
    npm install [package] —save-optional yarn add [package] —optional
    npm install [package] —save-exact yarn add [package] —exact
    (N/A) yarn add [package] —tilde
    npm install [package] —global yarn global add [package]
    npm update —global yarn global upgrade
    npm rebuild yarn add —force
    npm uninstall [package] yarn remove [package]
    npm cache clean yarn cache clean [package]
    rm -rf node_modules && npm install yarn upgrade
    npm version major yarn version —major
    npm version minor yarn version —minor
    npm version patch yarn version —patch
    npm explain [package] yarn why [package]
    npm audit [package] yarn audit [package]

    При создании нового проекта react создает файлы npm при использовании yarn

    Такая проблема. При создании нового проекта react использую yarn . Но он создаёт файлы и npm . Как это исправить ?

    Отслеживать

    задан 12 янв 2021 в 8:14

    Itachi Saai Itachi Saai

    а что вы имеете ввиду под npm файлами?

    12 янв 2021 в 8:16

    Создаёт папку node_modules ( при создании через yarn, вроде не должен ее создавать )

    12 янв 2021 в 8:26

    не, это не относится к npm, npm и yarn это пакетные менеджеры, они формируют node-modules скачивая и устанавливая их для дальнейшего использования, node.js — отдельная программа, она использует node-modules

    12 янв 2021 в 8:30

    Спасибо за ответ. Думал что не должно быть этих файлов

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *