All three use the same npm registry. You can switch between them freely. The differences are in speed, disk usage, and features.
npm if you want the default that just works. pnpm if you want the fastest, most disk-efficient option. yarn if your team already uses it.
Side-by-side
| npm | pnpm | yarn | |
|---|---|---|---|
| Speed | Good | Fastest | Fast |
| Disk usage | High (copies per project) | Lowest (shared store) | High |
| Lock file | package-lock.json | pnpm-lock.yaml | yarn.lock |
| Workspaces | Yes | Yes (best) | Yes |
| Strictness | Loose (phantom deps) | Strict (no phantom deps) | Loose |
| Built-in | Comes with Node.js | Install separately | Install separately |
| Plug’n’Play | No | No | Yes (optional) |
Speed comparison
Installing a medium project (cold cache):
pnpm install: ~8 seconds
yarn install: ~12 seconds
npm install: ~15 seconds
pnpm is consistently 30-50% faster than npm.
The disk usage difference
npm and yarn copy every package into each project’s node_modules. If you have 10 projects using React, you have 10 copies of React.
pnpm uses a global content-addressable store. Each package version is stored once on disk, and projects link to it. 10 projects using React = 1 copy of React.
For developers with many projects, pnpm saves gigabytes of disk space.
Phantom dependencies
npm and yarn have a flat node_modules structure. This means you can accidentally import packages you didn’t explicitly install (phantom dependencies). It works locally but breaks in production.
pnpm uses a strict node_modules structure. You can only import packages listed in your package.json. This catches bugs early.
How to choose
- Starting a new project? pnpm (fastest, strictest, most disk-efficient).
- Existing project with package-lock.json? Stay with npm unless you have a reason to switch.
- Existing project with yarn.lock? Stay with yarn.
- Monorepo? pnpm (best workspace support).
- Don’t want to install anything extra? npm (comes with Node.js).
Switching is easy
# To pnpm
npm install -g pnpm
rm -rf node_modules package-lock.json
pnpm install
# To yarn
npm install -g yarn
rm -rf node_modules package-lock.json
yarn install
See also: npm cheat sheet | pnpm cheat sheet