Atualizações Mais Inteligentes de Pacotes Com npm-check-updates
O descompasso de dependências mata projetos lentamente. Você pula algumas atualizações, depois mais algumas, e de repente está olhando para 47 pacotes desatualizados—metade com mudanças que quebram compatibilidade, alguns com vulnerabilidades de segurança, e nenhum caminho claro a seguir. Executar npm update parece roleta russa. Atualizações em massa quebram o CI. A escolha segura se torna não fazer nada, o que não é seguro de forma alguma.
npm-check-updates (ncu) oferece uma abordagem diferente: separar a decisão do que atualizar do ato de instalar e testar. Essa distinção importa mais do que a maioria das equipes percebe.
Pontos-Chave
- ncu modifica os intervalos de versão do package.json sem tocar em node_modules ou seu lockfile, dando a você controle sobre quando a instalação acontece
- Use
--target minorou--target patchpara limitar atualizações a mudanças que não quebram compatibilidade - A flag
--peerprevine sugestões de atualizações que causariam conflitos de peer dependency - Sempre faça commit de package.json e package-lock.json juntos após testar as atualizações
- Use o campo
overridesdo npm para forçar versões específicas de dependências transitivas ao lidar com vulnerabilidades
Por Que Atualizações Cegas Quebram Builds
O problema central com o gerenciamento de pacotes JavaScript não é encontrar dependências desatualizadas—npm outdated cuida disso. O problema é que atualizar para “latest” ignora restrições de peer dependency, limites de semver, e a realidade de que seu lockfile existe por uma razão.
Quando você executa npm update, o npm respeita os intervalos de versão no seu package.json. Ele não vai pular de ^2.0.0 para 3.0.0 mesmo que a versão 3 exista. Isso é intencional. Mas também significa que atualizações genuínas que requerem mudanças de intervalo ficam presas indefinidamente.
ncu resolve isso modificando o package.json diretamente—atualizando intervalos de versão—sem tocar em node_modules ou seu lockfile. Você controla quando a instalação acontece.
Workflows Modernos de ncu para Gerenciamento de Dependências Node.js
Instalações globais não são mais o modelo mental padrão. Com ncu v18+, execute-o diretamente via seu gerenciador de pacotes:
npx npm-check-updates
# ou
pnpm dlx npm-check-updates
# ou
bunx npm-check-updates
Isso verifica por atualizações sem modificar nada. Você vê o que está disponível, codificado por cores por nível de semver: vermelho para major, ciano para minor, verde para patch.
A flag crítica é -u, que escreve mudanças no package.json. Mas aqui está o que importa: isso apenas atualiza o manifesto. Seu lockfile permanece inalterado até que você execute explicitamente npm install.
Essa separação permite um workflow mais seguro de atualização de dependências:
- Execute
ncu -u --target minorpara atualizar package.json com mudanças que não quebram compatibilidade - Execute
npm installpara regenerar o lockfile - Execute sua suíte de testes
- Se os testes passarem, faça commit de package.json e package-lock.json juntos
Para atualizações major, trate-as individualmente com ncu -u --filter package-name, revise o changelog, e então teste.
Discover how at OpenReplay.com.
Peer Dependencies e Verificação de Compatibilidade
Conflitos de peer dependency causam a maioria das falhas de atualização. Uma biblioteca de componentes React pode requerer React 18, mas seu projeto fixa React 17. Atualizar a biblioteca cegamente quebra o build.
A flag --peer do ncu verifica compatibilidade de peer dependency antes de sugerir atualizações. Isso previne propor atualizações que falhariam imediatamente na instalação.
Para controle mais rigoroso, combine isso com --target:
ncu --peer --target minor
Isso mostra apenas atualizações que não vão quebrar restrições de peer e não vão cruzar limites de versão major.
Lockfiles e Integração com Pipeline de CI
Seu lockfile representa um estado funcionando conhecido. Trate-o adequadamente.
No CI, sempre use npm ci em vez de npm install. O comando ci falha se package.json e package-lock.json estiverem fora de sincronia—exatamente o que você quer. Isso captura situações onde alguém atualizou package.json mas esqueceu de regenerar o lockfile.
Para workflows automatizados de atualização de dependências no CI, o padrão se parece com:
ncu -u --target patch
npm install
npm test
Se os testes passarem, o pipeline faz commit das mudanças. Se falharem, a atualização é sinalizada para revisão manual.
Controlando Dependências Transitivas Com Overrides
Às vezes o problema não são suas dependências diretas—é do que elas dependem. Uma vulnerabilidade três níveis abaixo na sua árvore de dependências requer atualizar um pacote que você não controla.
O campo overrides do npm permite que você force versões específicas de dependências transitivas:
{
"overrides": {
"vulnerable-package": "2.0.1"
}
}
Isso é uma parte padrão do gerenciamento de pacotes JavaScript. Use quando você precisa de um patch de segurança antes que os mantenedores upstream atualizem suas dependências.
Conclusão
Automação de atualização de dependências não significa atualizar tudo constantemente. Significa ter um processo repetível que separa descoberta de instalação, respeita limites de semver, e mantém seu lockfile em sincronia com seu manifesto.
ncu se encaixa nesse workflow porque trata atualizações de package.json como uma etapa distinta. Você decide o que atualizar, quando instalar, e quando testar. A ferramenta cuida da parte tediosa—verificar registros e modificar intervalos de versão—enquanto deixa as decisões de julgamento para você.
Atualize patches semanalmente. Revise minors mensalmente. Trate majors deliberadamente. Mantenha seu lockfile commitado. Seu CI vai agradecer.
Perguntas Frequentes
npm update instala versões mais recentes dentro dos intervalos de versão existentes no seu package.json, mas não vai cruzar limites de versão major. npm-check-updates modifica os intervalos de versão no próprio package.json, permitindo que você atualize para qualquer versão incluindo releases major. ncu muda o manifesto enquanto npm update muda node_modules.
Sim. ncu funciona com qualquer gerenciador de pacotes já que apenas modifica package.json. Execute-o com pnpm dlx npm-check-updates ou npx npm-check-updates independentemente do seu gerenciador de pacotes. Depois que ncu atualiza seu package.json, use seu gerenciador de pacotes preferido para instalar as dependências atualizadas.
Use a flag reject com um nome de pacote ou padrão. Por exemplo, ncu --reject typescript exclui TypeScript das atualizações. Você também pode usar ncu --reject '/react.*/' para excluir múltiplos pacotes que correspondem a um padrão. Isso é útil para pacotes que você quer atualizar manualmente.
Executar ncu -u apenas modifica package.json sem instalar nada. O risco vem de executar npm install depois sem testar. Sempre execute sua suíte de testes após atualizar e instalar. Comece com atualizações patch usando ncu -u --target patch para a abordagem mais segura.
Understand every bug
Uncover frustrations, understand bugs and fix slowdowns like never before with OpenReplay — the open-source session replay tool for developers. Self-host it in minutes, and have complete control over your customer data. Check our GitHub repo and join the thousands of developers in our community.