Перейти к основному содержимому
Версия: 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.