Перейти к содержанию
Innovialabs

npm, Yarn или pnpm: какой менеджер пакетов выбрать

Практика3 мин

Коротко

npm — надежный выбор по умолчанию, pnpm экономит диск и строже следит за зависимостями, что особенно ценно в монорепозиториях, а Yarn удобен командам, которым нужны его особые режимы; главное — один менеджер и один lockfile на проект.

Короткий ответ

  • npm идет вместе с Node.js, ничего ставить не нужно. Подходит большинству проектов.
  • pnpm хранит пакеты в общем хранилище и подключает их ссылками: меньше места на диске, быстрая повторная установка и строгий доступ к зависимостям. Хорош для монорепозиториев.
  • Yarn (современные версии) предлагает режим Plug'n'Play без папки node_modules и продуманные workspaces, но требует от команды понимания его особенностей.

Важнее самого выбора — не смешивать менеджеры: в репозитории должен быть один lockfile.

Основа: package.json, semver и lockfile

package.json описывает проект: зависимости, скрипты, версию Node.js. Версии зависимостей задаются по правилам semver — MAJOR.MINOR.PATCH:

  • ^1.4.2 — разрешены 1.x.x начиная с 1.4.2 (новые минорные и патч-версии);
  • ~1.4.2 — только патчи 1.4.x;
  • 1.4.2 — строго эта версия.

Диапазон означает, что сегодня и через месяц install может поставить разные версии. Поэтому существует lockfile — файл с точными версиями всего дерева зависимостей:

МенеджерLockfile
npmpackage-lock.json
Yarnyarn.lock
pnpmpnpm-lock.yaml

Lockfile нужно коммитить. В CI используйте установку строго по нему: npm ci, yarn install --immutable (в современных версиях Yarn), pnpm install --frozen-lockfile.

Сравнение трех менеджеров

КритерийnpmYarnpnpm
УстановкаИдет с Node.jsЧерез Corepack или отдельноЧерез Corepack или отдельно
Место на дискеКопия в каждом проектеЗависит от режимаОбщее хранилище, ссылки
СтрогостьПлоский node_modulesPnP строгийСтрогий по умолчанию
WorkspacesЕстьЕсть, развитыеЕсть, развитые
СовместимостьМаксимальнаяPnP иногда требует настройкиВысокая, редкие пакеты нужно донастроить

Скорость во многом зависит от кэша, сети и размера проекта, поэтому сравнивать лучше на собственном репозитории, а не по чужим бенчмаркам.

Что значит строгость

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

pnpm кладет в корень node_modules только прямые зависимости, остальные скрыты. Ошибка проявится сразу, а не после обновления. Yarn в режиме PnP вообще контролирует разрешение модулей сам.

Workspaces и монорепозитории

Все три поддерживают workspaces — несколько пакетов в одном репозитории с общей установкой. Пример для pnpm:

# pnpm-workspace.yaml
packages:
  - "apps/*"
  - "packages/*"

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

Как выбрать

  1. Небольшой проект или команда без особых требований — npm.
  2. Монорепозиторий, много проектов на одной машине, нужна строгость — pnpm.
  3. Команда уже на Yarn и довольна — оставайтесь, миграция ради миграции не нужна.
  4. Зафиксируйте менеджер в поле packageManager в package.json и включите Corepack, чтобы у всех была одна версия.

Частые ошибки

  • Два lockfile в репозитории — половина команды ставит одни версии, половина другие.
  • Lockfile в .gitignore — сборки перестают быть воспроизводимыми.
  • npm install вместо npm ci в CI — lockfile может незаметно измениться.
  • Импорт пакетов, которых нет в package.json — работает до первого обновления.

Частые вопросы

Обычно да: pnpm умеет импортировать существующий lockfile командой pnpm import. Проблемы возникают, если код опирается на фантомные зависимости — их придется явно добавить в package.json.

Поможем с этим

Если хотите не разбираться самим, а получить результат — этим мы занимаемся каждый день.

Обсудить проект

Читайте также

Есть идея или задача? Расскажите нам

Ответим в течение рабочего дня и предложим решение. Консультация бесплатная.