npm, Yarn или pnpm: какой менеджер пакетов выбрать
Практика3 минРедакция Innovialabs
Коротко
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 |
|---|---|
| npm | package-lock.json |
| Yarn | yarn.lock |
| pnpm | pnpm-lock.yaml |
Lockfile нужно коммитить. В CI используйте установку строго по нему: npm ci, yarn install --immutable (в современных версиях Yarn), pnpm install --frozen-lockfile.
Сравнение трех менеджеров
| Критерий | npm | Yarn | pnpm |
|---|---|---|---|
| Установка | Идет с Node.js | Через Corepack или отдельно | Через Corepack или отдельно |
| Место на диске | Копия в каждом проекте | Зависит от режима | Общее хранилище, ссылки |
| Строгость | Плоский node_modules | PnP строгий | Строгий по умолчанию |
| Workspaces | Есть | Есть, развитые | Есть, развитые |
| Совместимость | Максимальная | PnP иногда требует настройки | Высокая, редкие пакеты нужно донастроить |
Скорость во многом зависит от кэша, сети и размера проекта, поэтому сравнивать лучше на собственном репозитории, а не по чужим бенчмаркам.
Что значит строгость
npm создает плоский node_modules: зависимости ваших зависимостей лежат на верхнем уровне, и код может импортировать пакет, которого нет в вашем package.json. Это фантомная зависимость — она работает, пока ее не уберет кто-то выше по дереву.
pnpm кладет в корень node_modules только прямые зависимости, остальные скрыты. Ошибка проявится сразу, а не после обновления. Yarn в режиме PnP вообще контролирует разрешение модулей сам.
Workspaces и монорепозитории
Все три поддерживают workspaces — несколько пакетов в одном репозитории с общей установкой. Пример для pnpm:
# pnpm-workspace.yaml
packages:
- "apps/*"
- "packages/*"
Внутренние пакеты подключаются ссылками, общий lockfile один. В больших монорепозиториях pnpm часто выбирают за экономию места и строгость, а npm — за простоту, если пакетов немного.
Как выбрать
- Небольшой проект или команда без особых требований — npm.
- Монорепозиторий, много проектов на одной машине, нужна строгость — pnpm.
- Команда уже на Yarn и довольна — оставайтесь, миграция ради миграции не нужна.
- Зафиксируйте менеджер в поле
packageManagerвpackage.jsonи включите Corepack, чтобы у всех была одна версия.
Частые ошибки
- Два lockfile в репозитории — половина команды ставит одни версии, половина другие.
- Lockfile в
.gitignore— сборки перестают быть воспроизводимыми. npm installвместоnpm ciв CI — lockfile может незаметно измениться.- Импорт пакетов, которых нет в package.json — работает до первого обновления.