PNPM (Performant NPM) — менеджер пакетов Node.js, созданный как более эффективная альтернатива npm и yarn. Ключевое отличие: PNPM не копирует пакеты в node_modules каждого проекта, а создаёт жёсткие ссылки (hard links) на глобальный контентно-адресуемый кэш (~/.pnpm-store). Пакет lodash@4.17.21, используемый в 100 проектах, хранится на диске один раз. На VPS с несколькими Node.js-проектами это экономит 5-15 ГБ дискового пространства.
Как работает
При pnpm install:
- Пакеты скачиваются в глобальный store (
~/.pnpm-store/v3/files/) с разбивкой по хэшам. - В
node_modules/.pnpm/создаётся плоская структура с символическими и жёсткими ссылками. - Публичная директория
node_modules/содержит только прямые зависимости проекта (без hoisting чужих транзитивных зависимостей).
Это решает «призрачные зависимости» (phantom dependencies) — классическую проблему npm: когда пакет использует транзитивную зависимость, не указанную в своём package.json, и это иногда работает только потому, что npm поднял её вверх через hoisting.
Workspace-монорепозитории: PNPM Workspaces позволяет управлять несколькими пакетами в одном репозитории с общим кэшем. Подходит для монорепозиториев на Node.js. Аналог yarn workspaces и npm workspaces, но эффективнее.
Сравнение менеджеров пакетов
| Параметр | npm | yarn | pnpm |
|---|---|---|---|
| Дисковое пространство | Много (копии) | Много (копии) | Минимально (hard links) |
| Скорость установки | Медленнее | Быстрее npm | Быстрее yarn |
| Phantom deps | Есть (hoisting) | Частично | Нет (строгая изоляция) |
| Workspaces | Да (с npm 7) | Да | Да (лучшая реализация) |
История
PNPM создан Зольтаном Кочаном в 2016 году на Linux-based CI/CD серверах. Версия 3.0 (2019) ввела content-addressable store. PNPM 6.0 (2021) добавил lockfile v5, версия 7.0 (2022) ускорила установку на 50-70% по сравнению с npm 7. По данным npm downloads, pnpm в 2023-2024 годах входит в тройку наиболее используемых менеджеров пакетов.
На что обращать внимание
PNPM устанавливается глобально: npm install -g pnpm или через corepack enable && corepack prepare pnpm@latest --activate. На серверах с несколькими Node.js-проектами (CI/CD, dev-среды) переход на pnpm даёт реальную экономию диска. В связке с nginx как прокси-сервером PNPM используется для сборки frontend-ассетов. В Docker: используйте .dockerignore для node_modules и монтирования store для ускорения сборки. Совместим со всеми npm-пакетами — замена npm в скриптах package.json тривиальна (заменить npm run на pnpm run).
PNPM в CI/CD
PNPM особенно эффективен в CI/CD пайплайнах: глобальный store можно закэшировать между сборками, что снижает время установки зависимостей с минут до секунд. GitHub Actions: cache: pnpm в action setup-node. GitLab CI: настройте .pnpm-store как artifact cache. В Docker многослойной сборке: сначала COPY pnpm-lock.yaml . и RUN pnpm install --frozen-lockfile, затем — копирование исходников. Это позволяет Docker кэшировать слой зависимостей и не устанавливать их при каждой сборке.