pnpm vs npm
As diferenças práticas entre pnpm e npm - como eles instalam pacotes, gerenciam espaço em disco, lidam com lockfiles e quando escolher um em vez do outro.
Busque em todas as páginas da documentação
As diferenças práticas entre pnpm e npm - como eles instalam pacotes, gerenciam espaço em disco, lidam com lockfiles e quando escolher um em vez do outro.
🤖 Read the SystemsArchitect.io Blog for over 100+ cloud architecture articles 🔥
Cartão de receita de referência rápida - pronto para copiar e colar.
# Instalar pnpm (requer Node.js 18.12+)
corepack enable
corepack prepare pnpm@latest --activate
# Ou instalar via npm
npm install -g pnpm
# Verificar
pnpm --version
# Comandos comuns - lado a lado
npm install # pnpm install
npm install react # pnpm add react
npm install -D vitest # pnpm add -D vitest
npm uninstall react # pnpm remove react
npm run dev # pnpm dev (ou pnpm run dev)
npm test # pnpm test
npx create-next-app # pnpm create next-app (ou pnpm dlx create-next-app)Quando usar isso: Ao iniciar um novo projeto ou avaliar se deve mudar de npm para pnpm. Entender os prós e contras ajuda você a fazer uma escolha informada, em vez de mudar com base em "hype".
O npm usa uma estrutura node_modules plana. Quando você executa npm install, ele:
package.json para dependências diretas.node_modules/ para reduzir a duplicação.package-lock.json para travar versões exatas.node_modules/
react/
react-dom/
scheduler/ # dependência do react-dom, elevada para o nível superior
loose-envify/ # dependência transitiva, também elevada
O problema com a elevação: seu código pode import pacotes que não estão no seu package.json porque eles foram elevados. Isso é chamado de dependências fantasmas - seu código funciona por acidente até que alguém remova o pacote que trouxe a dependência transitiva.
O pnpm usa um store de endereçamento por conteúdo e links simbólicos. Quando você executa pnpm install, ele:
~/.local/share/pnpm/store/ no macOS/Linux).node_modules/.pnpm/ com hard links para o store global.node_modules/ que apontam apenas para suas dependências diretas.node_modules/
react -> .pnpm/react@19.1.0/node_modules/react
react-dom -> .pnpm/react-dom@19.1.0/node_modules/react-dom
.pnpm/
react@19.1.0/
node_modules/
react/ # hard link para o store global
react-dom@19.1.0/
node_modules/
react-dom/ # hard link para o store global
scheduler/ # link simbólico para .pnpm/scheduler@.../
Este layout significa:
package.json - sem dependências fantasmas.node_modules é menor e as instalações são mais rápidas porque os arquivos são linkados, não copiados.| Recurso | npm | pnpm |
|---|---|---|
Estrutura do node_modules | Plana, elevada | Linkada simbolicamente, estrita |
| Uso de disco | Cópia completa por projeto | Store de endereçamento por conteúdo, hard links |
| Dependências fantasmas | Permitidas (elevação) | Bloqueadas por padrão |
| Velocidade de instalação | Moderada | Mais rápida (links em vez de cópias) |
| Lockfile | package-lock.json | pnpm-lock.yaml |
| Suporte a Monorepo | Workspaces (npm 7+) | Workspaces + pnpm-workspace.yaml |
| Vem com o Node.js | Sim | Não (instalar separadamente ou via Corepack) |
| Equivalente a npx | npx | pnpm dlx |
| Atalho para scripts | npm run dev | pnpm dev |
| Tratamento de peer dependencies | Instalado automaticamente (npm 7+) | Estrito - avisa ou dá erro em peers ausentes |
| Suporte Corepack | n/a (embutido) | Sim - "packageManager": "pnpm@9.x" em package.json |
Com o npm, se você tem 10 projetos que usam React 19, o React é copiado 10 vezes. Com o pnpm, o React 19 é armazenado uma vez no store global e hard-linkado em cada projeto. Em uma máquina com muitos projetos, o pnpm pode economizar gigabytes de espaço em disco.
# Ver quanto espaço o store do pnpm está usando
pnpm store status
# Limpar pacotes não referenciados do store
pnpm store pruneO pnpm é consistentemente mais rápido que o npm por várias razões:
Benchmarks típicos mostram o pnpm 2-3x mais rápido que o npm em instalações frias e significativamente mais rápido em instalações quentes (quando os pacotes já estão no store).
O layout estrito do node_modules do pnpm pega bugs reais:
// Isso funciona com npm (dependência fantasma), mas falha com pnpm:
import chalk from 'chalk';
// Erro: chalk não está listado em package.jsonSe o seu código só funciona por causa da elevação do npm, o pnpm exporá a dependência ausente imediatamente. Isso é um recurso, não um bug - significa que seu package.json é uma descrição precisa do que seu projeto realmente usa.
Tanto npm quanto pnpm suportam workspaces, mas a implementação do pnpm é mais madura:
# pnpm-workspace.yaml
packages:
- 'apps/*'
- 'packages/*'# Executar um comando em um workspace específico
pnpm --filter @myapp/web dev
# Instalar uma dependência em um workspace específico
pnpm --filter @myapp/web add zod
# Executar um comando em todos os workspaces
pnpm -r buildO flag --filter do pnpm é mais poderoso que o flag --workspace do npm, suportando padrões glob, filtragem baseada em dependência e filtragem de mudanças desde o commit.
| Tarefa | npm | pnpm |
|---|---|---|
| Instalar todas as deps | npm install | pnpm install |
| Adicionar um pacote | npm install zod | pnpm add zod |
| Adicionar um dev dep | npm install -D vitest | pnpm add -D vitest |
| Remover um pacote | npm uninstall zod | pnpm remove zod |
| Executar um script | npm run dev | pnpm dev |
| Executar testes | npm test | pnpm test |
| Executar um binário | npx create-next-app | pnpm dlx create-next-app |
| Atualizar deps | npm update | pnpm update |
| Auditar vulnerabilidades | npm audit | pnpm audit |
| Listar instalados | npm ls | pnpm ls |
| Instalação global | npm install -g tsx | pnpm add -g tsx |
# 1. Instalar pnpm
corepack enable
corepack prepare pnpm@latest --activate
# 2. Excluir artefatos do npm
rm -rf node_modules package-lock.json
# 3. Instalar com pnpm
pnpm install
# 4. (Opcional) Fixar a versão do pnpm em package.json
# Adicionar: "packageManager": "pnpm@9.15.4"
# 5. Atualizar seus scripts - npm run -> pnpm
# Atualizar configuração de CI (GitHub Actions, etc.)A migração geralmente é indolor. Se falhar, é quase sempre por causa de dependências fantasmas - pacotes que seu código importa, mas que estão faltando em package.json. Corrija-os adicionando os pacotes ausentes explicitamente.
node_modules e package-lock.json."packageManager" em package.json garante que todos usem a mesma ferramenta e versão.package.json, ele funciona com npm, mas falha com pnpm. A correção é adicionar o pacote ausente a package.json - isso é a coisa certa a fazer de qualquer maneira.node_modules plano. Pacotes mais antigos que usam truques de require.resolve ou percorrem a árvore de diretórios podem falhar com o layout linkado simbolicamente do pnpm. A solução alternativa é node-linker=hoisted em .npmrc, mas isso anula a rigidez do pnpm.package-lock.json (JSON). pnpm usa pnpm-lock.yaml (YAML). Você não pode usar ambos - escolha um e adicione o outro a .gitignore.npx não existe no pnpm. Use pnpm dlx em vez disso. Exemplo: pnpm dlx create-next-app em vez de npx create-next-app.react como peer dependency e você não o instalou, pnpm avisa ou dá erro. Corrija instalando a peer dependency.pnpm/action-setup ou Corepack para instalar pnpm antes de executar pnpm install.pnpm store prune periodicamente para limpar pacotes não mais referenciados por nenhum projeto.| Ferramenta | Pontos Fortes | Pontos Fracos |
|---|---|---|
| npm | Vem com o Node.js, maior suporte do ecossistema | Elevação plana, dependências fantasmas, instalações mais lentas |
| pnpm | Rápido, estrito, eficiente em disco, ótimo suporte a monorepo | Etapa de instalação extra, mais estrito pode quebrar pacotes legados |
| Yarn Classic (1.x) | Estável, amplamente utilizado | Modo de manutenção, problemas de elevação semelhantes aos do npm |
| Yarn Berry (3+) | Plug'n'Play, zero-installs | Curva de aprendizado íngreme, problemas de compatibilidade, PnP pode confundir ferramentas |
| Bun | Instalações extremamente rápidas, runtime + bundler | Mais novo, não 100% compatível com Node.js, ecossistema menor |
Você não deve. Cada um tem seu próprio formato de lockfile (package-lock.json vs pnpm-lock.yaml) e estrutura node_modules. Escolha um e faça commit apenas do seu lockfile. Adicione o lockfile do outro a .gitignore.
Sim. Next.js funciona com pnpm "out of the box". pnpm create next-app cria um novo projeto. A única ressalva é que alguns exemplos do Next.js usam comandos npm em seus READMEs - basta substituí-los pelos equivalentes do pnpm.
Corepack é uma ferramenta incluída no Node.js (18.17+) que gerencia as versões do gerenciador de pacotes. Quando você define "packageManager": "pnpm@9.15.4" em package.json, o Corepack garante que todos usem exatamente essa versão. Habilite-o com corepack enable.
Sim, na maioria dos benchmarks. pnpm é 2-3x mais rápido em instalações frias e ainda mais rápido em instalações quentes (quando os pacotes já estão no store global). A velocidade vem de hard linkar arquivos em vez de copiá-los e de requisições de rede paralelas.
Pacotes que seu código importa, mas que não estão listados em seu package.json. Eles funcionam com npm porque a elevação torna as dependências transitivas acessíveis no nível superior. pnpm bloqueia isso por padrão, o que pega bugs reais - seu código só deve importar pacotes dos quais você depende explicitamente.
Use pnpm dlx. Por exemplo: pnpm dlx create-next-app em vez de npx create-next-app. O comando dlx baixa e executa o pacote sem instalá-lo permanentemente.
Sim. Exclua node_modules e pnpm-lock.yaml, em seguida, execute npm install. Isso gera um novo package-lock.json. Se você tinha dependências fantasmas que o pnpm pegou, elas "funcionarão" silenciosamente novamente sob o npm.
Sim. Configure o registro em .npmrc da mesma forma que faria para npm: registry=https://your-registry.example.com/. pnpm lê arquivos .npmrc.
Yarn Classic (1.x) é semelhante ao npm com elevação plana. Yarn Berry (3+) usa Plug'n'Play, que evita completamente node_modules, mas tem problemas de compatibilidade com alguns pacotes. pnpm fica no meio - estrito e rápido, sem os problemas de compatibilidade do PnP.
Se o npm está funcionando bem e sua equipe está confortável, não há urgência. Considere mudar se estiver iniciando um novo projeto, gerenciando um monorepo, ou se estiver enfrentando lentidão nas instalações e pressão de espaço em disco. A migração geralmente é direta.
Revisado por Chris St. John·Última atualização: 19 de jul. de 2026
🤖 Read the SystemsArchitect.io Blog for over 100+ cloud architecture articles 🔥