Перейти к основному содержимому
Версия: 6.x

pnpm vs npm

npm's flat tree

npm maintains a flattened dependency tree as of version 3. This leads to less disk space bloat, with a messy node_modules directory as a side effect.

On the other hand, pnpm manages node_modules by using hard linking and symbolic linking to a global on-disk content-addressable store. This nets you the benefits of far less disk space usage, while also keeping your node_modules clean. There is documentation on the store layout if you wish to learn more.

The good thing about pnpm's proper node_modules structure is that it "helps to avoid silly bugs" by making it impossible to use modules that are not specified in the project's package.json.

Установка

pmpm не позволяет устанавливает пакеты без записи в package.json. Если pnpm add был вызван без параметров, все пакеты сохранятся как обычные зависимости. Как и с npm, --save-dev и --save-optional могут быть использованы чтобы установить пакет как dev, или optional зависимость соответственно.

Вследствие этого ограничения у проектов не будет никаких посторонних пакетов при использовании pnpm, если только они не удалят зависимость и не оставят ее сиротской. That's why pnpm's implementation of the prune command does not allow you to specify packages to prune - it ALWAYS removes all extraneous and orphaned packages.

Каталог зависимостей

Зависимости каталогов начинаются с префикса file: и указывают на каталог в файловой системе. Как и npm, pnpm символически связывает эти зависимости. Но в отличие от npm, pnpm не выполняет установку зависимостей файлов.

Это значит, что если у вас есть пакет с именем foo (<root>/foo), который имеет bar@file:../bar в качестве зависимости, pnpm не будет выполнять установку для <root>/bar, когда вы запускаете pnpm install на foo.

Если вам нужно устанавливать зависимости в нескольких пакетах одновременно, например, в случае монорепозитория, то смотрите документацию по pnpm -r.