← Назад к вопросам

В чем преимущество pnpm?

2.0 Middle🔥 61 комментариев
#Инструменты и DevOps

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI2 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Преимущества pnpm перед npm и yarn

pnpm (performant npm) — это альтернативный менеджер пакетов для Node.js, который появился в 2017 году. За последние годы он набрал популярность благодаря ряду серьёзных улучшений. Давайте разберём основные преимущества.

1. Дисковое пространство: жёсткие ссылки вместо дублирования

npm и yarn хранят копии каждого пакета для каждого проекта. Если установить React 18.2 в 5 проектов — будет 5 одинаковых копий на диске.

pnpm использует глобальное хранилище и жёсткие ссылки. Для всех 5 проектов будет одна копия React, а каждый проект будет на неё ссылаться.

// npm: node_modules занимает ~450 МБ
// pnpm: node_modules занимает ~50 МБ (одинаковый packages)

// На диске экономия может быть ГИГАбайты, если много проектов

Практический пример:

# npm: 5 проектов x 450MB = 2.25GB
# pnpm: глобальное хранилище + 5x50MB ссылок = 500MB + 250MB = 750MB
# Экономия: 1.5GB!

2. Скорость установки

pnpm быстрее npm и yarn благодаря оптимизированному алгоритму и параллельной загрузке:

npm install   # ~90 секунд
yarn install  # ~75 секунд
pnpm install  # ~35 секунд

# Примерно в 2-3 раза быстрее

Почему быстрее:

  • Параллельная загрузка пакетов
  • Жёсткие ссылки вместо копирования
  • Оптимизированное разрешение зависимостей

3. Более строгая структура node_modules

npm и yarn хранят ВСЕ зависимости на одном уровне (плоская структура), что позволяет импортировать пакеты, которые не указаны в package.json:

// package.json
{
  "dependencies": {
    "react": "^18.0.0"
  }
}

// Код работает в npm/yarn
import express from 'express'; // express — это зависимость React!!
// npm/yarn позволяет это (плохо, скрытая зависимость)

// pnpm это НЕ позволит
// Error: Cannot find module 'express'

pnpm использует вложенную структуру, где видны только прямые зависимости. Это предотвращает импорт "скрытых" зависимостей.

npm node_modules/:
  react/
  react-dom/
  express/        <- express — не в dependencies!
  lodash/         <- lodash — не в dependencies!
  (50 других пакетов)

pnpm node_modules/:
  react/
  react-dom/
  .pnpm/          <- остальное скрыто в .pnpm
    express/
    lodash/

Это ловит ошибки на уровне IDE и линтера.

4. Улучшенная обработка версий (phantom dependencies)

Проблема в npm/yarn:

// package.json
{
  "dependencies": {
    "foo": "1.0.0"  // foo зависит от bar@2.0
  }
}

// В npm можно случайно использовать bar, хотя его нет в dependencies
import bar from 'bar'; // Работает в npm, потому что bar в node_modules

// Потом разработчик foo обновляет версию bar
// npm разрешает bar@3.0 (другая версия)
// Твой код ломается!

pnpm предотвращает это:

// pnpm не даст импортировать bar
// Error: bar not in dependencies

// Нужно явно добавить в package.json

5. Монорепо поддержка (workspaces)

pnpm имеет встроенную и удобную поддержку монорепо:

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

# Установка зависимостей для всех пакетов
pnpm install

# Запуск скрипта во всех пакетах
pnpm -r run build

# Интерзависимости работают автоматически

6. Детерминированность (reproducible builds)

pnpm.lock файл гарантирует одинаковую версию пакетов для всех разработчиков:

# Разработчик A
pnpm install
node_modules/react/package.json -> "18.2.0"

# Разработчик B
pnpm install
node_modules/react/package.json -> "18.2.0" (одна и та же версия!)

# npm/yarn может установить 18.2.1 для разработчика B

7. Модульная архитектура

pnpm легче расширяется и обновляется:

# Версионирование инструментов
pnpm update  # Обновляет сам pnpm
pnpm install --prod-only  # Только production зависимости
pnpm prune   # Удаляет неиспользуемые зависимости

Когда использовать pnpm

Идеально для:

  • Больших монорепо (Monorepo с множеством пакетов)
  • Проектов с ограниченным местом на диске
  • Команд, где важна скорость CI/CD
  • Когда нужна строгость (предотвращение скрытых зависимостей)

Когда npm/yarn могут быть лучше:

  • Для очень старых проектов (иногда совместимость)
  • Когда разработчики уже используют npm/yarn (меньше переходной период)
  • Для публичных пакетов (npm более стандартизирован)

Миграция на pnpm

# 1. Установить pnpm
npm install -g pnpm

# 2. Удалить node_modules и lock файлы
rm -rf node_modules
rm package-lock.json yarn.lock

# 3. Переустановить зависимости
pnpm install

# 4. Тестировать приложение
pnpm test
pnpm build

# 5. Коммитить pnpm-lock.yaml

Сравнительная таблица

Особенность       | npm  | yarn | pnpm
-----------------------------------------
Скорость          | 3    | 4    | 5
Дисковое место    | 1    | 2    | 5
Монорепо          | 2    | 4    | 5
Строгость         | 1    | 2    | 5
Популярность      | 5    | 4    | 3
Совместимость     | 5    | 4    | 3

Реальный пример: монорепо с pnpm

# Структура проекта
my-monorepo/
  pnpm-workspace.yaml
  apps/
    web/
      package.json
    api/
      package.json
  packages/
    ui/
      package.json
    utils/
      package.json

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

# Зависимость между пакетами
# apps/web/package.json
{
  "dependencies": {
    "@myrepo/ui": "workspace:*",   # Локальная зависимость
    "@myrepo/utils": "workspace:*"
  }
}

# Команды
pnpm install      # Установит все пакеты в монорепо
pnpm -r test      # Запустит тесты во всех пакетах
pnpm -w add lodash # Добавит lodash в корневой package.json

Заключение

pnpm — это современный менеджер пакетов, который решает реальные проблемы npm/yarn:

  • Экономия диска через жёсткие ссылки
  • Скорость благодаря оптимизациям
  • Безопасность через строгую структуру
  • Удобство монорепо с встроенной поддержкой

Для новых проектов и монорепо pnpm — это отличный выбор.