Введение в 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 # Удалить неиспользуемые пакеты
Discover how at OpenReplay.com.
Конфигурация для современных проектов
Создайте файл .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.