Most JavaScript projects use npm, Yarn, or pnpm. They all install dependencies and run package scripts, but they make different tradeoffs around speed, disk usage, dependency layout, workspaces, and compatibility.
The short answer: use npm if you want the default and least surprising choice, pnpm if you want efficient installs and stricter dependency behavior, and Yarn if your project or organization already standardizes on its workflow.
npm
npm ships with Node.js and is the most widely supported package manager in the ecosystem.
Basic commands:
npm init
npm install react
npm run build
Strengths:
- Installed with Node.js.
- Broad ecosystem support.
- Simple for beginners and small projects.
- Good enough for many teams.
Tradeoffs:
- Can use more disk space across many projects.
- Historically more tolerant of dependency layout assumptions.
- Large monorepos may prefer stronger workspace and store behavior from other tools.
If your project already works well with npm and CI is stable, there is no automatic need to migrate.
Yarn
Yarn was originally popular because it improved install performance and lockfile consistency when npm was weaker in those areas. Today, Yarn has its own workflow and version differences, so always check which Yarn generation a project uses.
Basic commands:
yarn init
yarn add react
yarn run build
Strengths:
- Strong workspace history.
- Good fit for teams already standardized on Yarn.
- Mature lockfile workflow.
Tradeoffs:
- Setup and behavior can vary by Yarn version.
- Some projects require learning Yarn-specific configuration.
- Not always the simplest choice for a new small project.
If a repository already has yarn.lock, use Yarn unless the team has intentionally migrated.
pnpm
pnpm focuses on speed, disk efficiency, and stricter dependency resolution. It uses a content-addressable store and links packages into projects instead of duplicating full dependency copies everywhere.
Basic commands:
pnpm init
pnpm add react
pnpm run build
Strengths:
- Efficient disk usage across many projects.
- Fast installs after packages are in the store.
- Stricter dependency layout helps reveal undeclared dependencies.
- Strong workspace support.
Tradeoffs:
- Some older tools assume npm-style hoisting.
- Migration requires CI and lockfile updates.
- Teams need to understand the different
node_modulesstructure.
If you decide to migrate, use Replacing npm with pnpm: A Complete Migration Guide rather than changing only your local install command.
Comparison table
| Area | npm | Yarn | pnpm |
|---|---|---|---|
| Default with Node.js | Yes | No | No |
| Common lockfile | package-lock.json |
yarn.lock |
pnpm-lock.yaml |
| Disk efficiency | Good enough | Depends on setup | Strong |
| Workspace support | Yes | Yes | Yes |
| Strict dependency layout | Moderate | Depends on setup | Strong |
| Beginner simplicity | Strong | Medium | Medium |
| Best fit | Default projects | Teams already using Yarn | Monorepos and dependency-heavy projects |
How to choose
Choose npm when:
- The project is small or straightforward.
- You want the default Node.js tooling.
- Your CI, hosting, and team already use npm.
Choose Yarn when:
- The repository already uses Yarn.
- Your organization has Yarn-specific workspace or release tooling.
- The team understands the chosen Yarn version and config.
Choose pnpm when:
- You work across many Node.js projects.
- Disk usage and install speed matter.
- You want stricter dependency boundaries.
- You are managing a monorepo or shared workspace.
Migration warnings
Do not mix lockfiles casually. A repository should normally commit one package-manager lockfile and use the same tool in local development and CI.
If you move to pnpm:
- Remove the old lockfile intentionally.
- Commit
pnpm-lock.yaml. - Update CI install commands.
- Update documentation.
- Check whether any tool depends on hoisted packages.
- Add
packageManagertopackage.jsonwhen appropriate.
Related FreeMac guides
- For a pnpm migration path, read Replacing npm with pnpm: A Complete Migration Guide.
- For everyday pnpm usage, read pnpm Practical Guide: Install, Scripts, Store, and Workspaces.
- For project setup files, read Front-End Config: Env, Node, Git, ESLint, and TypeScript.
Continue reading
pnpm in Practice: Installation, Migration, and Workspaces
Use pnpm for faster installs, smaller dependency storage, stricter resolution, npm migration, and practical workspace management across frontend projects.
7 minReplacing npm with pnpm: A Complete Migration Guide
Migrate from npm to pnpm without breaking CI. Update lockfiles, install commands, dependency layout assumptions, hoisting fallbacks, and team workflow.
14 min readFront-End Config: Env, Node, Git, ESLint, and TypeScript
Set up .env files, Node versions, Git ignores, ESLint flat config, Prettier, and TypeScript with clear responsibilities, safe secret handling, and a repeatable workflow.
Subscribe to FreeMac
Weekly picks: free Mac software reviews, trusted source updates, alternatives, and low-friction guides.