pnpm vs npm
Structure flat de npm
npm maintient une arborescence de dépendances aplaties depuis la version 3. Cela mène a une réduction d'espace disque, avec un répertoire node_modules
désordonné comme effet secondaire.
D'un autre côté, pnpm gère les node_modules
en utilisant un lien fixe et un lien symbolique vers un magasin global adressable au contenu sur le disque. This lets you get the benefits of far less disk space usage, while also keeping your node_modules
clean. Il y a une documentation sur l'agencement du magasin si vous voulez en savoir plus.
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
.
Installation
pnpm does not allow installation of packages without saving them to package.json
. If no parameters are passed to pnpm add
, packages are saved as regular dependencies. Like with npm, --save-dev
and --save-optional
can be used to install packages as dev or optional dependencies.
As a consequence of this limitation, projects won't have any extraneous packages when they use pnpm unless they remove a dependency and leave it orphaned. 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.
Directory dependencies
Directory dependencies start with the file:
prefix and point to a directory in the filesystem. Like npm, pnpm symlinks those dependencies. Unlike npm, pnpm does not perform installation for the file dependencies.
This means that if you have a package called foo
(<root>/foo
) that has bar@file:../bar
as a dependency, pnpm won't perform installation for <root>/bar
when you run pnpm install
on foo
.
If you need to run installations in several packages at the same time, for instance in the case of a monorepo, you should look at the documentation for pnpm -r
.