npm vs yarn vs pnpm: A Comparação Honesta
Os três instalam pacotes do registro npm. Os três usam package.json. As diferenças estão na velocidade, uso de disco e como lidam com a pasta node_modules.
Comparação Rápida
| Feature | npm | Yarn (v4) | pnpm |
|---|---|---|---|
| Velocidade (cold install) | Mais lento | Rápido | Mais rápido |
| Uso de disco | Duplica pacotes | Plug'n'Play (sem node_modules) | Store endereçável por conteúdo (compartilhado) |
| Monorepo | Workspaces | Workspaces (melhor) | Workspaces (melhor de todos) |
| Rigidez | Hoista tudo | Estrito por padrão (PnP) | Estrito (sem phantom deps) |
| Vem com Node.js | Sim | Via Corepack | Instalação separada |
| Lock file | package-lock.json | yarn.lock | pnpm-lock.yaml |
Comandos de Instalação
# Instalar todas as dependências
npm install yarn install pnpm install
# Adicionar um pacote
npm install express yarn add express pnpm add express
# Adicionar dev dependency
npm install -D jest yarn add -D jest pnpm add -D jest
# Remover um pacote
npm uninstall lodash yarn remove lodash pnpm remove lodash
# Rodar um script
npm run dev yarn dev pnpm dev
# Executar um binário
npx create-next-app yarn dlx create-next-app pnpm dlx create-next-app
# Atualizar pacotes
npm update yarn up pnpm updatePor Que pnpm É Rápido
pnpm usa um store endereçável por conteúdo. Quando você instala lodash@4.17.21 no projeto A, ele é baixado uma vez para um store global. O projeto B que precisa da mesma versão recebe um hard link — sem duplicação. Isso significa:
- Installs mais rápidos: Pacotes já no store não são baixados novamente
- Menos espaço em disco: 100 projetos usando React não significam 100 cópias
- node_modules estrito: Pacotes só podem acessar suas dependências declaradas (sem phantom dependencies)
Por Que Yarn PnP (Plug'n'Play)
Yarn pode eliminar node_modules inteiramente. Em vez disso, cria um arquivo .pnp.cjs que mapeia imports para arquivos zip em .yarn/cache/. Benefícios:
- Zero installs: Commite o cache no git, CI não precisa instalar
- Installs instantâneos: Sem operações de file system
- Ressalva: Algumas ferramentas não suportam PnP e precisam de plugins de compatibilidade
Phantom Dependencies
npm e yarn classic "hoistam" dependências, permitindo que seu código importe pacotes que você não declarou no package.json. Funciona na sua máquina mas quebra quando aquela dependência transitiva é removida.
// Você nunca instalou 'glob' — é dep de outro pacote
import glob from 'glob'; // Funciona com npm (hoisted)
// Falha com pnpm (modo estrito) — força declarar corretamenteQual Escolher
- npm: Escolha padrão, funciona em todo lugar, bom o suficiente para a maioria
- pnpm: Melhor para monorepos, CI com disco limitado, times que querem deps estritas
- yarn: Se quer PnP/zero-installs ou seu time já usa
Honestamente? Escolha qualquer um e mantenha. As diferenças de velocidade são segundos, não minutos. Consistência no time importa mais que benchmarks.
Gerencie seus pacotes: Formatador JSON — formate e valide seus arquivos package.json.