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

Ответ

PNPM (Performant NPM) — это альтернативный менеджер пакетов для Node.js с ключевыми преимуществами:

  1. Экономия дискового пространства:
    Хранит зависимости в едином хранилище (hard links), избегая дублирования одинаковых пакетов в разных проектах. Например, если 10 проектов используют lodash@4.17.21, на диске будет только одна копия.

  2. Скорость установки:
    За счет кэширования и симлинков установка пакетов быстрее, чем в npm/yarn. Особенно заметно в монорепозиториях.

  3. Строгая изоляция зависимостей:
    По умолчанию запрещает доступ к неперечисленным в package.json пакетам (в отличие от npm/yarn, где возможен доступ к транзитивным зависимостям).

Пример сравнения структур:

# node_modules в npm/yarn (дублирование)
project1/node_modules/lodash
project2/node_modules/lodash

# pnpm (hard link в общее хранилище)
.pnpm-store/lodash@4.17.21
project1/node_modules/lodash -> .pnpm-store/lodash@4.17.21

Ответ 18+ 🔞

Ага, слушай, вот есть у нас этот PNPM, ну, пизда, такой менеджер пакетов для Node.js. Не то чтобы он прям новый, но он, блядь, сделал такую штуку, что все вокруг него начали охуевать тихонько.

Первое, что он делает — экономит место на диске, как последний еврей. Представь: у тебя десять проектов, и в каждом сидит один и тот же lodash. Ну, обычный npm или yarn — они ж, мудя, в каждом проекте свою копию этого lodash'а разложат! А этот хитрожопый PNPM берёт и кладёт одну-единственную копию в какое-то своё центральное хранилище, а в твои проекты просто кидает на неё ссылки, эти... hard links, блядь. И всё! Овердохуища места сэкономил, в рот меня чих-пых!

Второе — скорость, ёпта. Потому что раз пакет уже в хранилище лежит, то при установке он не тащит его по сети, а просто ссылку создаёт. Особенно в этих ваших монорепозиториях, где проектов как говна за баней — там разница просто пиздец!

И третье, самое смешное — изоляция зависимостей. Он, сука, такой строгий дядя! Если ты в package.json не прописал пакет — то твой код к нему и не подступится, даже если он где-то рядом болтается в node_modules. А в npm/yarn, блядь, бывало такое: пакет A зависит от B, а твой код вдруг начинает использовать B напрямую, хотя ты его явно не устанавливал. И потом, когда A обновится и B выкинет — у тебя всё ебётся! А PNPM говорит: "Нет, мудила, играй по правилам". И не даёт.

Вот, смотри, как это выглядит на практике, чтобы совсем понятно было:

# С npm/yarn — пиздец, дублирование везде
project1/node_modules/lodash   # Одна копия
project2/node_modules/lodash   # Вторая, такая же, блядь, копия!

# А с PNPM — одна копия на всех, а в проектах просто ссылки
~/.pnpm-store/lodash@4.17.21                           # Единственная копия в хранилище
~/projects/project1/node_modules/lodash -> (ссылка)    # Ссылка, ёбта!
~/projects/project2/node_modules/lodash -> (ссылка)    # И тут ссылка!

Вот и вся магия, блядь. Ничего сложного, а работает — заебись. Правда, некоторые старые пакеты, которые накосячили с импортами, могут поначалу ругаться, но это уже их проблемы, а не PNPM.