pnpm

Disk-efficient package manager - hard links save space, strict dependencies, fast monorepo support

TL;DR

What: Fast, disk space efficient package manager for Node.js.

Why: 2x faster than npm, saves disk space, strict dependencies, great monorepo support.

Quick Start

Install:

# npm
npm install -g pnpm

# Homebrew
brew install pnpm

# Check version
pnpm --version

Basic usage:

pnpm init
pnpm add express
pnpm install
pnpm dev

Cheatsheet

CommandDescription
pnpm add pkgAdd dependency
pnpm add -D pkgAdd dev dependency
pnpm remove pkgRemove package
pnpm installInstall all deps
pnpm updateUpdate packages
pnpm run scriptRun script
pnpm dlx pkgExecute package (like npx)

Gotchas

Installing packages

# Production dependency
pnpm add express

# Dev dependency
pnpm add -D typescript

# Global package
pnpm add -g nodemon

# Specific version
pnpm add [email protected]

# From workspace
pnpm add @myorg/shared --filter @myorg/web

Workspaces (monorepo)

# pnpm-workspace.yaml
packages:
  - 'packages/*'
  - 'apps/*'
# Install all workspace deps
pnpm install

# Run script in specific package
pnpm --filter @myorg/web dev

# Run in all packages
pnpm -r run build

# Add dep to specific package
pnpm add lodash --filter @myorg/utils

# Add workspace dependency
pnpm add @myorg/shared --filter @myorg/web --workspace

Filtering

# By package name
pnpm --filter @myorg/web dev

# By directory
pnpm --filter ./packages/web dev

# All packages
pnpm -r run test

# Packages with changes
pnpm --filter "...[origin/main]" run test

# Dependencies of package
pnpm --filter "@myorg/web..." run build

Configuration (.npmrc)

# Strict mode (recommended)
strict-peer-dependencies=true
auto-install-peers=true

# Shamefully hoist (compatibility mode)
shamefully-hoist=true

# Store location
store-dir=~/.pnpm-store

# Registry
registry=https://registry.npmmirror.com

Migration from npm/yarn

# Import from package-lock.json
pnpm import

# Or just delete and reinstall
rm -rf node_modules package-lock.json yarn.lock
pnpm install

Scripts

{
  "scripts": {
    "dev": "vite",
    "build": "tsc && vite build",
    "test": "vitest"
  }
}
# Run script
pnpm dev
pnpm run build

# Run binary
pnpm exec vitest

# Execute package without installing
pnpm dlx create-react-app my-app

Next Steps