Back

Введение в pnpm: более быстрая альтернатива npm и Yarn

Введение в pnpm: более быстрая альтернатива npm и Yarn

Если вы когда-либо наблюдали, как ваш CI/CD-конвейер тратит минуты на установку зависимостей, или сталкивались с нехваткой дискового пространства на машинах разработки из-за дублирования пакетов между проектами, вы испытываете именно те проблемы, для решения которых был создан pnpm. Этот производительный менеджер пакетов предлагает принципиально иной подход к управлению зависимостями, который может сократить время установки в 2-3 раза и уменьшить использование диска примерно на 50%.

Ключевые выводы

  • pnpm использует контент-адресуемое хранилище с жёсткими ссылками для устранения дублирования пакетов между проектами
  • Строгое разрешение зависимостей предотвращает фантомные зависимости и обнаруживает ошибки до продакшена
  • Скорость установки улучшается в 2-3 раза по сравнению с npm, при этом использование диска сокращается на 50%
  • Встроенная поддержка workspace делает его идеальным для монорепозиторных архитектур

Что делает pnpm особенным

В отличие от npm и Yarn, которые дублируют пакеты между проектами, pnpm использует контент-адресуемое хранилище с жёсткими ссылками для глобального совместного использования зависимостей. Когда вы устанавливаете Express в нескольких проектах, npm создаёт отдельные копии в каждой папке node_modules. pnpm сохраняет его один раз в ~/.pnpm-store и создаёт жёсткие ссылки на эту единственную копию, что значительно сокращает использование диска при сохранении полной изоляции между проектами.

Эта архитектура также предотвращает «фантомные зависимости» — распространённую проблему, когда код может случайно импортировать пакеты, не указанные в package.json. Благодаря строгому разрешению модулей Node.js в pnpm, если зависимость не объявлена явно, ваш код не сможет получить к ней доступ, обнаруживая ошибки до того, как они попадут в продакшен.

Установка и настройка

Для Node.js 16.13 или новее рекомендуемый метод установки использует Corepack:

corepack enable
corepack prepare pnpm@latest --activate

Альтернативно можно установить через npm:

npm install -g pnpm

Основные команды для ежедневной разработки

Основные команды pnpm повторяют знакомый синтаксис npm, добавляя при этом оптимизации производительности:

pnpm add express          # Добавить production-зависимость
pnpm add -D typescript    # Добавить dev-зависимость
pnpm remove lodash       # Удалить пакет
pnpm update             # Обновить все зависимости
pnpm run build         # Выполнить скрипт из package.json

Команда pnpm store предоставляет уникальную функциональность для управления глобальным кешем пакетов:

pnpm store status      # Проверить состояние хранилища
pnpm store prune      # Удалить неиспользуемые пакеты

Конфигурация для современных проектов

Создайте файл .npmrc для настройки поведения pnpm для вашей команды:

strict-peer-dependencies=true
auto-install-peers=true
prefer-offline=true

Эти настройки обеспечивают соблюдение требований peer-зависимостей, автоматически устанавливают peer-зависимости (Node.js 16+) и приоритизируют кешированные пакеты для ускорения установки.

Настройка workspace для монорепозиториев

Для монорепозиторных проектов поддержка workspace в pnpm превосходно справляется с управлением несколькими пакетами. Создайте файл pnpm-workspace.yaml:

packages:
  - 'packages/*'
  - 'apps/*'

Свяжите пакеты workspace, используя протокол workspace: в package.json:

{
  "dependencies": {
    "@myapp/shared": "workspace:*",
    "@myapp/ui": "workspace:^1.0.0"
  }
}

Запускайте команды для всех пакетов workspace:

pnpm -r build                  # Собрать все пакеты
pnpm --filter @myapp/api dev   # Запустить dev-скрипт в конкретном пакете

Оптимизация CI/CD

Для GitHub Actions используйте официальный action для pnpm с Node.js 22 LTS:

- uses: pnpm/action-setup@v4
  with:
    version: 9
- uses: actions/setup-node@v4
  with:
    node-version: 22
    cache: 'pnpm'
- run: pnpm install --frozen-lockfile
- run: pnpm test

Для GitLab CI настройте кеширование для максимальной оптимизации CI/CD:

image: node:22

before_script:
  - corepack enable
  - corepack prepare pnpm@latest --activate

cache:
  key: pnpm-store-$CI_COMMIT_REF_SLUG
  paths:
    - .pnpm-store

install:
  script:
    - pnpm config set store-dir .pnpm-store
    - pnpm install --frozen-lockfile

Флаг --frozen-lockfile обеспечивает воспроизводимые сборки, завершаясь с ошибкой, если pnpm-lock.yaml не соответствует package.json, предотвращая расхождения между окружениями разработки и продакшена.

Производительность на практике

Команды, мигрирующие с npm, обычно видят улучшение скорости установки в 2-3 раза благодаря эффективной стратегии связывания pnpm. Проект среднего размера с 500 зависимостями может занимать 60 секунд с npm, но всего 20-25 секунд с pnpm. Экономия дискового пространства ещё более впечатляющая — разработчики, работающие над несколькими проектами, часто освобождают 5-10 ГБ пространства, поскольку дублирующиеся пакеты устраняются.

Заключение

pnpm выполняет своё обещание более быстрого и эффективного управления зависимостями благодаря инновационной архитектуре, а не инкрементальным улучшениям. Его строгое разрешение зависимостей обнаруживает ошибки на ранних этапах, а возможности настройки workspace делают его идеальным для современных монорепозиторных архитектур. Независимо от того, оптимизируете ли вы CI/CD-конвейеры или управляете сложными full-stack приложениями, pnpm обеспечивает производительность и надёжность, необходимые командам разработки, не жертвуя при этом совместимостью с существующей экосистемой npm.

Часто задаваемые вопросы

pnpm по умолчанию обеспечивает строгое разрешение peer-зависимостей. Он не будет автоматически устанавливать peer-зависимости, если вы не включите auto-install-peers в вашей конфигурации. Это предотвращает конфликты версий и гарантирует, что ваш проект явно объявляет все необходимые зависимости.

Да, pnpm полностью совместим с проектами npm и Yarn. Просто выполните pnpm import в директории вашего проекта, чтобы сгенерировать файл pnpm-lock.yaml из существующего lock-файла. Все ваши npm-скрипты и конфигурации package.json работают без изменений.

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

Абсолютно. pnpm готов к продакшену и используется крупными компаниями. Используйте pnpm install --frozen-lockfile в продакшене для обеспечения точных версий зависимостей. Детерминированные установки и строгое разрешение зависимостей фактически делают развёртывания более надёжными, чем с традиционными менеджерами пакетов.

Understand every bug

Uncover frustrations, understand bugs and fix slowdowns like never before with OpenReplay — the open-source session replay tool for developers. Self-host it in minutes, and have complete control over your customer data. Check our GitHub repo and join the thousands of developers in our community.

OpenReplay