
В области менеджеров пакетов есть три основных игрока:
npm
Yarn
High-Performance npm (pnpm).
На самом деле у нас во всех менеджерах пакетов реализованы в основном схожие функции, поэтому вы, скорее всего, решите, какой из них использовать, основываясь на нефункциональных требованиях. Менеджер пакетов. , например скорость установки, потребление памяти или практичность.
Конечно, способы использования каждого менеджера пакетов будут разными, но все они имеют в основном одинаковые концепции. Все вышеперечисленные менеджеры пакетов могут выполнять следующие команды:
. Однако, несмотря на это, менеджеры пакетов различаются внутри. Традиционно npm и Yarn устанавливали зависимости в плоскую папку node_modules. (Обратите внимание на порядок: сначала yarn укладывается в плитку, а npm раньше был рекурсивным). Но укладка плитки также может вызвать ряд проблем с безопасностью.
Неопределенность структуры зависимости.
Сам алгоритм выравнивания очень сложен и требует много времени.
Пакеты с объявленными зависимостями
по-прежнему могут быть несанкционированно доступны в проекте.
Поэтому pnpm ввел некоторые новые концепции в папку node_modules для более эффективного хранения зависимостей. Yarn Berry идет еще дальше, полностью отказываясь от режима (PnP) node_modules (подробнее об этом в другой статье).
Самым ранним выпущенным менеджером пакетов был npm еще в январе 2010 года. Он установил основные принципы работы менеджеров пакетов сегодня. Но поскольку npm существует уже более 10 лет, почему есть другой вариант? Вот несколько основных причин, почему это может быть так:
node_modules имеет разные алгоритмы разрешения зависимостей (вложенные и мозаичные, node_modules и режим PnP) иhoisting ).locking (различная производительность, например, тот, который написан самой yarn ).workspaces ), что влияет на удобство обслуживания и скорость monoreposДавайте углубимся в история того, как эти аспекты были определены после возникновения npm , как Yarn Classic решила некоторые из этих проблем, как pnpm расширила эти концепции и как Yarn Berry , как преемник Yarn Classic ломает эти традиционные концепции и процессы.
npm — создатель менеджеров пакетов. Многие ошибочно полагают, что npm — это аббревиатура от «Менеджер пакетов Node», но это не так.
Его выпуск стал революцией, поскольку раньше зависимости проекта загружались и управлялись вручную. npm представил такие вещи, как файлы и их поля метаданных, хранение зависимостей в node_modules , пользовательские сценарии, общедоступные и частные пакеты и многое другое.
В 2020 году GitHub приобрел npm, поэтому в принципе теперь npm находится под управлением Microsoft. На момент написания последней основной версией является v8, выпущенная в октябре 2021 года.
В октябре 2016 года Facebook объявил о партнерстве с Google и рядом других компаний для разработки нового менеджера пакетов (engineering.fb.com/2016/10/11/…) для решения проблемы существовавшей на тот момент согласованности npm. проблемы безопасности и производительности. Они назвали замену Yarn.
Хотя Yarn по-прежнему спроектирован и спроектирован на основе многих концепций и процессов npm , Yarn оказал значительное влияние на область менеджеров пакетов. По сравнению с npm , Yarn распараллеливает операции для ускорения процесса установки, что было основной проблемой в более ранних версиях npm .
Yarn установил более высокие стандарты чтения и записи, безопасности и производительности, а также изобрел множество концепций (позже npm также сделал много улучшений для этого), в том числе:
monorepo поддерживаетLockingYarn v1 в режиме обслуживания в 2020. С тех пор серия v1.x считается устаревшей и переименована в Yarn Classic . Его преемник Yarn v2 (Berry) теперь является более активной веткой разработки.
pnpmВерсия 1 pnpm была выпущена в 2017 году Золтаном Кочаном. Это замена npm , поэтому, если у вас есть проект npm , вы можете сразу использовать pnpm !
Основная причина создания pnpm заключается в том, что npm и Yarn очень избыточны с точки зрения структур хранения зависимостей, используемых в проектах. Хотя Yarn Classic имеет преимущество в скорости по сравнению с npm , он использует тот же метод разрешения зависимостей, которого нет в pnpm : npm и Yarn Classic используют hoisting для выравнивания своих node_modules .
Вместо оптимизации предыдущей структуры pnpm предлагает другую стратегию разрешения зависимостей: a. структура хранения с адресацией содержимого. Папка node_modules , созданная этим методом, фактически зависит от каталога ~/.pnpm-store/ , который хранится глобально в основной папке. Каждая версия зависимостей физически сохраняется один раз в этой папке каталога, образуя единый исходный адрес для экономии значительного дискового пространства.
Структура node_modules представляет собой вложенную структуру зависимостей, созданную с помощью symlinks (где каждый файл/пакет в папке хранится через жесткую ссылку). Следующий рисунок из официальной документации иллюстрирует это. (Картинки для заполнения: мягкие и жесткие ссылки)

Влияние pnpm видно в отчете за 2021 год: благодаря инновациям в области хранения с адресацией по содержимому конкуренты стремятся перенять концепции pnpm , такие как структура символических ссылок и эффективное управление дисками пакетов.
Yarn 2, был выпущен в январе 2020 года и был объявлен серьезным обновлением оригинальной Yarn . Команда Yarn называет его Yarn Berry , чтобы было более очевидно, что это, по сути, новый менеджер пакетов с новой базой кода и новыми принципами.
Главным нововведением Yarn Berry является подход Plug-and-Play (PnP) в качестве стратегии восстановления node_modules. Вместо стратегии создания node_modules создайте файл .pnp.cjs с таблицей поиска зависимостей, что позволяет более эффективно обрабатывать зависимости, поскольку это отдельный файл, а не структура вложенных папок. Кроме того, каждый пакет хранится в папке в виде zip-файла вместо .yarn/cache/ и занимает меньше места на диске, чем node_modules .
Все эти изменения произошли так быстро, что вызвали много споров после выхода. Такие критические изменения в PnP требуют, чтобы сопровождающие обновляли свои существующие пакеты, чтобы они были совместимы с ним. Использовать новый подход PnP по умолчанию и вернуться к node_modules изначально было непросто, что привело к тому, что многие известные разработчики не рассматривали его и публично критиковали Yarn 2.
С тех пор команда Yarn Berry решила множество проблем в своих последующих выпусках. Чтобы решить проблемы несовместимости PnP, команда предоставила способ легко изменить режим работы по умолчанию. С помощью плагина node_modules для возврата к традиционному подходу node_modules требуется всего одна строка конфигурации.
Кроме того, экосистема JavaScript со временем обеспечивает все большую поддержку PnP, и, как вы можете видеть из этой таблицы совместимости, некоторые крупные проекты начали использовать Yarn Berry .
Несмотря на то, что Yarn Berry еще молод, он уже оказывает влияние на сферу менеджеров пакетов — pnpm принял подход PnP в конце 2020 года.
Менеджер пакетов сначала должен быть установлен в локальной системе и системе CI/CD каждого разработчика.
npm поставляется с Node.js , поэтому никаких дополнительных действий не требуется. Помимо загрузки установщика Node.js для вашей операционной системы, стало обычной практикой использовать инструменты CLI для управления версиями программного обеспечения. В контексте Node очень удобной утилитой стал Node Version Manager (nvm) или Volta.
Вы можете установить Yarn 1 разными способами, например, как пакет npm : .$ npm i -g yarn
Для перехода с Yarn Classic на Yarn Berry рекомендуемый метод:
Установите или обновите Yarn Classic до
версии
используя команду
Yarn Set Version berry.
Однако рекомендуемый способ установки Yarn Berry здесь — через Corepack.
Corepack был создан разработчиками Yarn Berry. Первоначально эта инициатива называлась Package Manager Manager (pmm) и была объединена с Node в LTS v16.
С помощью Corepack Node становится альтернативным менеджером пакетов для npm , который не нужно устанавливать «отдельно», поскольку он включает двоичные файлы Yarn Classic , Yarn Berry и pnpm . Эти прокладки позволяют пользователям запускать команды Yarn и pnpm без их предварительной установки и без нарушения дистрибутива Node.
Corepack поставляется с предустановленным Node.js ≥ v16.9.0. Однако для более старых версий Node вы можете использовать ⬇️
npm install -g corepack,
чтобы включить Corepack перед его использованием. В этом примере показано, как активировать его в Yarn Berry v3.1.1.
# сначала вам нужно зарегистрироваться $ corepack включить # прокладка установлена, но необходимо активировать конкретную версию $ corepack подготовить [email protected] --activate
Вы можете установить pnpm как пакет npm : $ npm i -g pnpm . Вы также можете установить pnpm с помощью Corepack:
$ corepack подготовить [email protected] --activate
В этом разделе вы кратко увидите основные функции различных менеджеров пакетов. Вы можете легко узнать, какие файлы участвуют в настройке конкретного менеджера пакетов и какие файлы создаются на этапе установки.
Все менеджеры пакетов хранят всю важную метаинформацию в файле манифеста проекта package.json. Кроме того, файлы конфигурации корневого уровня можно использовать для настройки различных частных пакетов или различных конфигураций разрешения зависимостей.
На этапе установки dependencies сохраняются в файловой структуре, такой как node_modules , и создается файл locking . В этом разделе не рассматриваются настройки рабочей области, поэтому во всех примерах показано только одно место, где хранятся зависимости.
используя $ npm install или более короткую версию $ npm i сгенерирую файл package-lock.json и папку node_modules . Существуют также настраиваемые файлы, такие как .npmrc , которые можно разместить в корневом каталоге. Дополнительную информацию о locking файлов смотрите в следующем разделе.
. ├── node_modules/ ├── .npmrc ├── package-lock.json └── package.json
, запуская $ yarn создаст файл yarn.lock и папку node_modules . Файлы .yarnrc также могут быть параметрами конфигурации, а Yarn Classic также поддерживает файлы .npmrc . Альтернативно вы можете использовать папку кэша .yarn/cache/ и последнюю версию Yarn Classic хранящуюся локально в .yarn/releases/ .
. ├── .пряжа/ │ ├── кэш/ │ └── релизы/ │ └── пряжа-1.22.17.cjs ├── node_modules/ ├── .yarnrc ├── package.json └── Yarn.lock
Из-за этого специального режима установки вам придется иметь дело с большим количеством файлов и папок в вашем проекте Yarn Berry чем с другими менеджерами пакетов. Некоторые из них являются необязательными, а некоторые являются обязательными.
Yarn Berry больше не поддерживает .npmrc или .yarnrc , для этого требуется .yarnrc.yml; Для традиционного рабочего процесса создания папок node_modules вы должны предоставить конфигурацию nodeLinker для использования конфигурации node_modules или pnpm (я не понимаю эту часть).
# .yarnrc.yml nodeLinker: node-modules # или pnpm,
запускающий $ yarn установит все зависимости в папку node_modules . И создается файл yarn.lock , который более новый, но несовместим с Yarn Classic . Кроме того, для автономной установки создается папка .yarn/cache/ . Эта папка является необязательной и используется для хранения версии Yarn Berry используемой в проекте.
. ├── .пряжа/ │ ├── кэш/ │ └── релизы/ │ └── пряжа-3.1.1.cjs ├── node_modules/ ├── .yarnrc.yml ├── package.json └── Yarn.lock
Независимо от того, является ли это строгим режимом или свободным режимом для PnP, выполнение $ yarn с .pnp.cjs и yarn.lock создаст .yarn/cache/ и .yarn/unplugged . Строгий PnP — режим по умолчанию. Если вы хотите настроить свободный режим, вам необходимо включить его в следующей форме⬇️:
# .yarnrc.yml. узелЛинкер: pnp pnpMode: свободный
В проекте PnP, помимо папки releases , папка .yarn скорее всего, также будет содержать папку sdk/ , обеспечивающую поддержку IDE. В зависимости от вашего варианта использования .yarn может даже содержать больше папок.
. ├── .пряжа/ │ ├── кэш/ │ ├── релизы/ │ │ └── пряжа-3.1.1.cjs │ ├── SDK/ │ └── отключено/ ├── .pnp.cjs ├── .pnp.loader.mjs ├── .yarnrc.yml ├── package.json └── Yarn.lock`Исходное состояние
такое же, как и для проекта npm или Yarn Classic . pnpm также требует файла package.json . После установки зависимостей с помощью $ pnpm i получаю папку node_modules , но ее структура совершенно другая, поскольку ее содержимое представляет собой адресное хранилище.
pnpm также генерирует собственный файл блокировки pnp-lock.yml . Вы можете предоставить дополнительную конфигурацию, используя дополнительный файл .npmrc .
. ├── node_modules/ │ └── .pnpm/ ├── .npmrc ├── package.json └── файл блокировки pnpm-lock.yml
Как упоминалось в предыдущем разделе, каждый менеджер пакетов создает файлы блокировки.
В файле lock хранится точная версия каждой зависимости, установленной вашим проектом, что обеспечивает более предсказуемую и детерминированную установку. Этот файл lock важен, поскольку зависимые версии, скорее всего, будут объявлены с указанием диапазона версий (например, ≥ v1.2.5), и если вы не «заблокируете» свою версию, фактическая установленная версия может отличаться.
Файлы блокировки иногда также хранят контрольные суммы (насколько я помню, хеш), которые мы рассмотрим более подробно в разделе безопасности.
Начиная с npm v5+, блокировка файлов всегда была основной функцией npm ( package-lock.json ). В pnpm это pnpm-lock.yaml . yarn.lock в Yarn Berry появляется в новом формате YAML.
В предыдущем разделе мы видели традиционный подход к установке зависимостей в структуру папок node_modules . Это решение используется npm , Yarn Classic и pnpm ( pnpm более эффективен, чем другие).
В режиме PnP Yarn Berry работает по-другому. Вместо папки node_modules зависимости хранятся в zip-файлах в виде комбинации файлов .yarn/cache/ и .pnp.cjs .
Лучше поставить эти файлы блокировки под контроль версий, поскольку каждый член команды устанавливает одну и ту же версию, что решает проблему «работает на вашей машине и на моей».
В следующей таблице сравниваются различные команды CLI, доступные в npm , Yarn Classic , Yarn Berry и pnpm . Это ни в коем случае не полный список, а скорее шпаргалка. В этом разделе не рассматриваются команды, связанные с рабочим процессом.
npm и pnpm имеют множество специальных псевдонимов команд и опций, что означает, что команды могут иметь разные имена, например, $ npm install и $ npm add . Кроме того, многие параметры команды имеют сокращенные версии, например -D вместо --save-dev . В таблице все сокращенные версии я называю псевдонимами. Используя каждый из этих менеджеров пакетов, вы можете добавлять, обновлять или удалять несколько зависимостей.
В этой таблице описаны команды управления зависимостями, используемые для установки или обновления всех зависимостей, указанных в package.json .
| Действие | npm | Yarn Classic | Yarn Berry | pnpm |
|---|---|---|---|---|
| install deps в package.json | npm install alias: i, добавить | Yarn install или Yarn, | например, Classic | pnpm install alias: я |
| обновить deps в package.json согласно semver | npm update alias: up, обновить | пряжу, обновить | пряжу. semver up (через плагин) | псевдоним обновления pnpm: |
| обновление deps в package.json до последнего | н/д | обновления пряжи --последнее | обновлениепряжи | pnpm --последний псевдоним: -L |
| обновление deps соотв. semver | npm update реагирует на | обновление пряжи, реагирует | на пряжу. semver up реагирует | pnpm up реагирует на |
| обновление deps до последнего | обновления npm response@latest | Yarn update реагирует --latest | Yarn up реагирует | pnpm up -L реагирует на |
| обновление deps в интерактивном режиме | Н/Д | Yarn Upgrade-Interactive | Yarn Upgrade-Interactive (через плагин) | $ pnpm up --interactive alias: -i |
| add runtime deps | npm я реагирую | Yarn add реагирую | как Classic | pnpm add реагирую |
| добавляю dev deps | npm i -D Babel alias: --save-dev | Yarn add -D Babel alias: --dev | Like Classic | pnpm add -D псевдоним Babel: --save-dev |
| добавить deps в package.json без semver | npm i -E псевдоним реакции: --save-exact | Yarn add -E псевдоним реакции: --exact | как классический | pnpm add -E псевдоним реакции: - -save-exact |
| uninstall deps и удалить из package.json | npm uninstall псевдоним реагирования: удалить, rm, r, un, unlink | Yarn удалить реакцию | , как классический | pnpm удалить псевдоним реакции: rm, un, uninstall |
| uninstall deps без обновления пакета. json | npm uninstall --no-save | Н/Д | Н/Д | Н/Д |
В следующем примере показано, как управлять пакетами во время разработки. Термины, используемые в таблице:
- Пакет: зависимость или двоичный
- файл. Бинарный: инструмент выполнения из
node_modules/.bin/или.yarn/cache/(PnP).
Важно понимать, что Yarn Berry позволяет нам выполнять только в package.json или Expose
указанные двоичные файлы в bin/ file.
| Действие | npm | Yarn Classic | Yarn Berry | pnpm |
|---|---|---|---|---|
| установить пакеты глобально | npm i -g ntl alias: --global | Yarn global add ntl | Н/Д (глобальное удалено) | pnpm add --global ntl |
| обновить пакеты глобально | npm update -g ntl | Yarn global update ntl | N /A | pnpm update --global ntl |
| удалить пакеты глобально | npm uninstall -g ntl | Yarn global удалить ntl | Н/Д | pnpm удалить --global ntl |
| запускать двоичные файлы из терминала | npm exec ntl | Yarn ntl | Yarn ntl | pnpm ntl |
| запускать двоичные файлы из сценария | ntl | ntl | ntl | ntl |
| динамическое выполнение пакета | npx ntl | Н/ | Д пряжа dlx ntl | pnpm dlx ntl |
| добавить время выполнения deps | npm i реакции | пряжи добавить реакцию | как Classic | pnpm добавить реакцию |
| добавить dev deps | npm i -D Babel alias: --save-dev | Yarn add -D Babel alias: --dev | Like Classic | pnpm добавить -D псевдоним Babel: --save-dev |
| добавить deps в package.json без Semver | npm i -E реагирующий псевдоним: --save-exact | Yarn add -E реагирующий псевдоним: --exact | Like Classic | pnpm добавить -E псевдоним реакции: --save-exact |
| удалить deps и удалить из package.json | npm удалить псевдоним реакции: удалить, rm, r, un, unlink | Yarn удалить реакцию | , как классический | pnpm удалить псевдоним реакции: rm, un, uninstall |
| uninstall deps без обновления package.json | npm uninstall --no-save | Н/Д | Н/Д | Н/Д |
В этой таблице описаны некоторые полезные встроенные команды. Если официальной команды нет, сторонние команды обычно можно использовать через пакеты npm или плагины Yarn Berry .
| Действие | npm | Yarn Classic | Yarn Berry | pnpm |
|---|---|---|---|---|
| опубликовать | npm опубликовать | пряжу опубликовать | пряжу npm опубликовать | pnpm опубликовать |
| список установленных deps | npm ls alias: list, la, ll | Yarn list | псевдоним списка pnpm: | |
| список ls устаревший deps | npm устаревший | Yarn устаревший | Yarnupgrade-interactive | pnpm устаревший |
| для печати информация о deps | npm объяснение псевдонима ntl: почему | Yarn почему ntl | нравится Classic | pnpm почему ntl |
| init project | npm init -y npm init (интерактивный) псевдоним: - -yes | Yarn init -y Yarn init (интерактивный) псевдоним: --yes | Yarn init | pnpm init -y pnpm init (интерактивный) псевдоним: --yes |
| информация о лицензиях на печать | Н/Д (через сторонний пакет) | список лицензий пряжи | Н/ A (или через плагин, другой плагин) | Н/Д (через сторонний пакет) |
| обновить версию менеджера пакетов | Н/Д (с помощью сторонних инструментов, например, nvm) | с помощью npm: набор политик пряжи версии 1.13.0 | с Corepack : набор пряжи версии 3.1.1 | Н/Д (с npm, Corepack) |
| выполнить аудит безопасности | npm аудит | пряжи аудит | пряжи npm аудит | pnpm аудит |
| добавить deps в package.json без semver | npm i -E псевдоним реакции: --save-exact | Yarn add -E псевдоним реакции: --exact | Like Classic | pnpm add -E React псевдоним: --save-exact |
| uninstall deps и удалить из package.json | npm uninstall псевдоним реакции: удалить, rm, r, un, unlink | Yarn удалить реакцию | , как Classic | pnpm удалить псевдоним реагирования: rm, un, uninstall |
| uninstall deps без обновления package.json | npm uninstall --no-save | Н/Д | Н/Д | Н/Д |
Настройка менеджера пакетов происходит в вашем package.json и специальных файлах конфигурации.
monorepoБольшая часть конфигурации происходит в файле частной конфигурации .npmrc .
Если вы хотите использовать функцию workspaces npm , вам необходимо добавить поле метаданных рабочих пространств в package.json чтобы сообщить npm, где найти папку подпроекта или рабочей области.
// ...
"рабочие места": [
«крючки»,
"утилиты"
]
} Каждый менеджер пакетов может использовать общедоступный реестр npm . Вероятно, вы захотите использовать их повторно, не публикуя в публичном реестре. Вы можете настроить это для конфиденциальности реестра в вашем файле .npmrc . (Практически у всех сейчас есть частные исходники)
# .npmrc @doppelmutzi:registry=https://gitlab.doppelmutzi.com/api/v4/projects/41/packages/npm/
Существует множество вариантов конфигурации npm , лучше всего ознакомиться с ними в документации.
Вы можете установить workspaces yarn в package.json (должен быть частный пакет).
{
// ...
«частное»: правда,
"workspaces": ["workspace-a", "workspace-b"]
} Любая дополнительная конфигурация сохраняется в файле .yarnrc . Распространенным вариантом конфигурации является установка yarn-path: он заставляет каждого члена команды использовать указанную двоичную версию. yarn-path указывает на папку, содержащую определенную версию Yarn (например, .yarn/releases/ ). Установить унифицированную версию Yarn Classic можно с помощью команды (classic.yarnpkg.com/en/docs/cli…).
Настройка workspaces в Yarn Berry аналогична настройке в Yarn Classic ( package.json ). Большая часть конфигурации Yarn Berry находится в .yarnrc.yml , и доступно множество вариантов конфигурации.
# .yarnrc.yml YarnPath: .yarn/releases/yarn-3.1.1.cjs
yarn berry может использовать метод импорта $> yarn plugin import <name> чтобы расширить плагин (yarnpkg.com/cli/plugin/…), эта команда будет также обновите .yarnrc.yml .
# .yarnrc.yml
плагины:
- путь: .yarn/plugins/@yarnpkg/plugin-semver-up.cjs
спецификация: «https://raw.githubusercontent.com/tophat/yarn-plugin-semver-up/master/bundles/%40yarnpkg/plugin-semver-up.js». Как упоминалось в разделе истории, по причинам совместимости, Могут возникнуть некоторые проблемы с зависимостями в строгом режиме PnP. Существует типичное решение проблемы PnP такого типа: политика настройки расширения пакетов.
# .yarnrc.yml
Расширения пакета:
"styled-компоненты@*":
зависимости:
response-is: "*" pnpm использует тот же механизм настройки, что и npm , поэтому вы можете использовать файлы .npmrc . Настройка частного реестра работает так же, как и использование npm . Проекты с несколькими пакетами можно поддерживать с помощью функции рабочей области pnpm. Чтобы инициализировать monorepo , необходимо указать расположение пакета в файле pnpm-workspace.yaml .
# pnpm-workspace.yaml пакеты: - 'packages/**'
(На самом деле здесь есть три концепции: одно хранилище и несколько проектов, одно хранилище и один проект и несколько хранилищ и несколько проектов).
monorepo — это репозиторий, содержащий несколько проектов. Эти проекты называются workspace или пакетами. Хранение всего в одном месте вместо использования нескольких репозиториев — это стратегия организации проекта.
Конечно, это вносит дополнительную сложность. Yarn Classic был первым, кто включил эту функцию, но теперь каждый крупный менеджер пакетов предлагает функциональность рабочей области. В этом разделе показано, как настроить рабочее пространство с помощью каждого из различных менеджеров пакетов.
Команда npm выпустила долгожданную функцию рабочего пространства npm в версии 7. Он содержит множество команд CLI, помогающих управлять многопакетными проектами из корневого пакета. Большинство команд можно использовать с параметрами, связанными с workspace чтобы сообщить npm , следует ли запускать его для определенного, нескольких или всех рабочих пространств.
# Установка всех зависимостей для всех рабочих областей $ npm я --workspaces. # запускаем один пакет $ npm запустить тест --workspace=hooks # запуск нескольких пакетов $ npm запустить тест --workspace=hooks --workspace=utils # беги против всех $ npm запустить тест --workspaces #игнорировать все пакеты, отсутствующие в тесте $ npm run test --workspaces --if-present
советы: по сравнению с другими менеджерами пакетов npm v8 в настоящее время не поддерживает расширенную фильтрацию или параллельное выполнение нескольких команд, связанных с рабочей областью.
В августе 2017 года команда Yarn объявила о поддержке monorepo для функциональности рабочей области. Раньше менеджеры пакетов можно было использовать только в проектах с несколькими пакетами со сторонним программным обеспечением, таким как Lerna. Это новое дополнение к Yarn также открывает возможность другим менеджерам пакетов реализовать такую функциональность.
Если вам интересно, вы можете узнать, как использовать функцию рабочего пространства Yarn Classic с Lerna и без нее. Но в этой статье будут представлены только некоторые необходимые команды, которые помогут вам управлять зависимостями в настройке рабочего пространства Yarn Classic .
# Установите все зависимости $yarn для всех рабочих областей # Показать дерево зависимостей $ информация о рабочих пространствах пряжи # Запустите другой пакет, чтобы запустить $ Yarn Workspace Awesome — запуск пакета # Добавляем Webpack в пакет $ Yarn Workspace Awesome - package add - D webpack # add React для всех пакетов $ Yarn add React -W
Yarn Berry с самого начала использовал рабочие пространства, поскольку его реализация построена на концепциях Yarn Classic . В комментарии Reddit ведущий разработчик Yarn Berry представил краткий обзор функций, ориентированных на рабочие пространства, в том числе:
Yarn Berry использует ряд протоколов, которые можно использовать в поле dependencies или devDependencies файла package.json . Среди них протокол workspace .
В отличие от рабочей области Yarn Classic , Yarn Berry четко определяет, что зависимость должна быть одним из пакетов в этом monorepo . В противном случае, если версии не совпадают, Yarn Berry может попытаться получить свою версию из удаленного реестра.
{
// ...
"зависимости": {
"@doppelmutzi/hooks": "рабочая область:*",
"http-сервер": "14.0.0",
// ...
}
} Через протокол workspace pnpm внес свой вклад в проект monorepo , аналогичный Yarn Berry . Многие команды pnpm принимают параметры --recursive (-r) или --filter, которые особенно полезны в контексте monorepo . Его собственные команды фильтрации также являются отличным дополнением к Lerna .
# обрезаем все рабочие области pnpm -r exec -- rm -rf node_modules && rm pnpm-lock.yaml # запускаем все тесты для всех рабочих пространств с областью действия @doppelmutzi pnpm рекурсивный тест запуска --filter @doppelmutzi/`
Производительность является ключевой частью решения о выборе. В этом разделе представлены тесты, основанные на малых и средних проектах. Вот некоторые примечания к примеру проекта:
Я измерил каждый из вариантов нашего менеджера пакетов один раз, используя три варианта использования (UC). Для получения подробной оценки и объяснений просмотрите результаты Проекта 1 (P1) и Проекта 2 (P2).
node_modules или .pnp.cjsnode_modules или .pnp.cjsnode_modules или .pnp.cjsя использовал инструмент gnomon для измерения времени, затраченного на установку ( yarn | gnomon ). Дополнительно я измерил размер сгенерированных файлов $ du -sh node_modules .
| Результаты деятельности по Проекту 1 | |||||||
|---|---|---|---|---|---|---|---|
| Метод | npm v8.1.2 | Yarn Classic v1.23.0 | pnpm v6.24.4 | Yarn Berry PnP свободный v3.1.1 | Yarn Berry PnP strict v3.1.1 | Yarn Berry node_modules v3.1.1 | Yarn Berry pnpm v3.1.1 |
| UC 1 | 86,63 с | 108,89 | с 43,58 | с 31,77 с | 30,13 | с 56,64 | с 60,91 |
| с UC 2 | 41,54 | с 65,49 | с 26,43 | с 12,46 | с 12,66 | с 46,36 | с 40,74 |
| с UC 3 | 23,59 | с 40,35 | с 20,32 | с 1,61 | с 1,36 | с 28,72 | с 31,8 9s |
| Файлы и размер | package-lock.json: 1,3M node_modules : 467M | node_modules: 397M Yarn.lock: 504K | pnpm-lock.yaml: 412K node_modules: 319M | Yarn.lock: 540K кэш: 68M отключено: 29M .pnp.cjs: 1,6M | Yarn.lock: 540K кэш: 68M отключено: 29M . pnp.cjs: 1,5 МБ | node_modules: 395 МБ пряжи.lock: 540 МБ кэша: 68 МБ | node_modules: 374 МБ пряжи.lock: 540 МБ кэша: 68 МБ |
| Результаты производительности для проекта 2 | |||||||
|---|---|---|---|---|---|---|---|
| Метод | npm v8.1.2 | Yarn Classic v1.23.0 | pnpm v6.24.4 | Yarn Berry PnP свободный v3.1.1 | Yarn Berry PnP strict v3.1.1 | Yarn Berry node_modules v3.1.1 | Yarn Berry pnpm v3.1.1 |
| UC 1 | 34,91 с | 43,26 | с 15,6 | с 13,92 с | 6,44 | с 23,62 с | 20,09 |
| с UC 2 | 7,92 | с 33,65 | с 8,86 | с 7,09 | с 5,63 | с 15,12 | с 14,93 |
| с UC 3 | 5,09 с | 15,64 | с 4,73 | с 0,93 | с 0,79 | с 8,18 | с 6,02 с |
| Файлы и размер | package-lock .json: 684 КБ узлов_модулей: 151 М | пряжи.lock: 268 тыс. node_modules: 159 млн | pnpm-lock.yaml: 212 тыс. node_modules: 141 млн | .pnp.cjs: 1,1 млн .pnp.loader.mjs: 8,0 тыс. Yarn.lock: 292 тыс. .yarn: 38 млн | .pnp.cjs: 1,0 M .pnp.loader.mjs: 8,0 КБ Yarn.lock: 292 КБ .yarn: 38 МБ | Yarn.lock: 292 КБ node_modules: 164 МБ кэша: 34 МБ | пряжи.lock: 292 КБ node_modules: 156 МБ кэша: 34 МБ |
npm слишком снисходителен к обработке плохих пакетов и обнаружил некоторые уязвимости безопасности, которые напрямую повлияли на многие проекты. Например, в версии 5.7.0 при выполнении команды sudo npm в операционной системе Linux вы можете изменить владельца системных файлов, что сделает операционную систему непригодной для использования.
Еще один инцидент произошел в 2018 году, связанный с кражей биткойнов. В пакет Node.js EventStream добавлена вредоносная зависимость в версии 3.3.6. Этот вредоносный пакет содержит криптографический метод, который пытается украсть биткойны с машины разработчика.
Чтобы решить эти проблемы, новые версии npm используют криптографические алгоритмы для проверки целостности установленных пакетов. ША-512.
Yarn Classic и Yarn Berry используют контрольные суммы для проверки целостности каждой упаковки с самого начала. Yarn также пытается помешать вам получить вредоносные пакеты, которые не объявлены в package.json : если обнаружено несоответствие, установка прерывается.
Yarn Berry в режиме PnP не имеет проблем с безопасностью традиционного метода node_modules . По сравнению с Yarn Classic , Yarn Berry повышает безопасность выполнения команд. Вы можете выполнять только пакеты, объявленные в package.json . Эта функция безопасности аналогична pnpm , которую я описываю ниже.
pnpm по-прежнему использует контрольные суммы для проверки целостности каждого установленного пакета перед выполнением его кода.
Как мы упоминали выше, и у npm , и Yarn Classic возникли проблемы с безопасностью из-за продвижения. pnpm избегает этой ситуации, поскольку его модель управления не использует повышение прав, а создает вложенные папки node_modules , тем самым устраняя риск несанкционированного доступа к зависимостям. Это означает, что зависимости объявлены в .package.json .
Как мы уже говорили, это особенно важно в условиях monorepo , поскольку алгоритмы повышения иногда могут привести к недетерминизму зависимостей.
| NPM | пряжа Классическая | пряжа ягода | PNPM |
| PNPM | СВЕЛТА РЕАТИКА | (с node_modules) | Vue 3 |
| Preact | Angular | Storybook (с node_modules) | Browserlist |
| Express.js | Ember | ||
| Babel | ( | с node_modules | ) |
| Prisma | Meteor | Next | . |
| Нукст | |||
| Создать приложение React | |||
| Webpack-Cli | |||
| Эмоции |
Есть действительно большие различия в принципах различных менеджеров пакетов.
Первоначально pnpm выглядит как npm в том смысле, что их pnpm CLI похоже, но управление зависимостями очень отличается; Yarn Classic по -прежнему популярна, но в ближайшем будущем можно отбросить устаревшее программное обеспечение, и поддержка может быть отброшена. Yarn Berry PnP является совершенно новой, но его потенциал революционизировать мир менеджера пакетов еще раз еще не реализован.
За эти годы многие пользователи спрашивали, кто использует, какие менеджеры пакетов, и в целом люди, похоже, особенно заинтересованы в зрелости и принятии Yarn Berry PnP .
Цель этой статьи - предоставить вам несколько перспектив, чтобы решить, какой менеджер пакетов использовать для себя. Я хотел бы отметить, что я не рекомендую конкретный менеджер пакетов. Это зависит от того, как вы взвешиваете различные требования - так что вы все еще можете выбрать все, что вам нравится!
Английский оригинальный адрес: https://blog.logrocket.com/javascript-package-managers-compared/