Lockfile no Node.js é o arquivo que registra as versões exatas e a árvore resolvida de dependências de um projeto. No npm, o arquivo principal é o package-lock.json. Ele permite que desenvolvimento local, CI e produção instalem uma estrutura previsível.
O package.json declara intervalos de versões, enquanto o lockfile registra o resultado concreto da resolução. Sem ele, duas instalações feitas em dias diferentes podem receber dependências transitivas distintas e apresentar bugs difíceis de reproduzir.
Neste guia, você aprenderá como o lockfile funciona, quando versioná-lo, como usar npm ci, tratar conflitos, atualizar dependências e proteger a cadeia de suprimentos.
package.json versus package-lock.json
{
"dependencies": {
"fastify": "^5.0.0"
}
}O intervalo permite versões compatíveis segundo a regra declarada. O lockfile registra a versão escolhida, integridade, origem e relações transitivas.
Por que versionar o lockfile?
- reproduzir instalações;
- reduzir diferenças entre máquinas;
- revisar mudanças na árvore;
- permitir uso de
npm ci; - facilitar auditoria;
- estabilizar builds de imagens e deploys.
Aplicações devem versionar o lockfile. Bibliotecas também podem versioná-lo para desenvolvimento e CI, embora consumidores resolvam sua própria árvore ao instalar a biblioteca.
npm install
npm installO comando instala dependências e pode atualizar o lockfile para reconciliar mudanças no package.json.
npm ci
npm cinpm ci exige consistência entre manifest e lockfile, remove a pasta node_modules existente e instala a árvore registrada sem reescrever o arquivo. É a opção recomendada para CI e builds reproduzíveis.
Não edite manualmente
O lockfile possui estrutura gerada pelo gerenciador. Mudanças manuais podem quebrar integridade ou criar uma árvore incoerente. Atualize dependências com comandos do npm.
Integridade
Entradas registram hashes de integridade dos artefatos. Isso ajuda a detectar conteúdo diferente do esperado durante instalação, mas não substitui revisão de origem e permissões do registry.
Dependências transitivas
Seu projeto pode declarar dez pacotes e instalar centenas. O lockfile torna visível essa árvore indireta e ajuda a identificar qual pacote introduziu uma versão vulnerável.
Atualização controlada
npm updateO comando atualiza dentro dos intervalos permitidos. Para alterar uma dependência específica:
npm install pacote@versaoRevise o diff do lockfile e execute testes.
Atualizações automáticas
Bots de dependências devem abrir pull requests pequenos, com changelog, diff e pipeline completo. Evite agrupar dezenas de mudanças sem relação, pois isso dificulta diagnóstico.
Conflitos de merge
Quando duas branches alteram dependências, o lockfile pode conflitar. Resolva os manifests primeiro e regenere a árvore com o gerenciador correto.
rm -rf node_modules
npm installNão escolha blocos aleatórios do conflito. Valide o diff final e execute npm ci.
Versão do gerenciador
Diferentes versões do npm podem gerar formatos ou decisões distintas. Padronize versões no time e no CI. Declare a versão de Node suportada em engines e documente o gerenciador.
Corepack e outros gerenciadores
Projetos que usam pnpm ou Yarn devem versionar apenas o lockfile correspondente e impedir instalações com gerenciador errado. Não mantenha múltiplos lockfiles concorrentes.
Lockfile em workspaces
npm Workspaces utiliza um lockfile na raiz para registrar todos os pacotes. Veja npm Workspaces no Node.js.
Docker
Copie manifests e lockfile antes do código para aproveitar cache:
COPY package.json package-lock.json ./
RUN npm ci --omit=dev
COPY . .Isso evita reinstalar dependências quando apenas o código muda.
Produção sem devDependencies
npm ci --omit=devUse somente quando o build já foi gerado ou quando ferramentas de desenvolvimento não são necessárias. Não omita dependências exigidas durante compilação antes da hora.
Auditoria
npm auditRelatórios precisam ser avaliados pelo contexto. Uma vulnerabilidade transitiva pode não ser alcançável, mas não deve ser ignorada sem análise documentada.
Overrides
{
"overrides": {
"dependencia-transitiva": "3.2.1"
}
}Overrides podem corrigir temporariamente uma versão indireta. Teste compatibilidade e remova a regra quando o pacote principal atualizar.
Revisando o diff
Observe:
- quantidade de pacotes adicionados;
- mudança de origem;
- scripts de instalação;
- novas dependências nativas;
- licenças;
- saltos grandes de versão;
- pacotes removidos inesperadamente.
Instalação congelada
O pipeline deve falhar se o manifest e o lockfile divergirem. Isso impede deploy baseado em uma resolução não revisada.
Cache de CI
Use o hash do lockfile como parte da chave de cache. Quando dependências mudam, uma nova chave evita reutilizar conteúdo incompatível.
Lockfile e segurança
Proteja alterações com revisão obrigatória. Um atacante que modifica o lockfile pode apontar para versão maliciosa ou introduzir pacote inesperado.
Combine revisão, registry confiável, autenticação forte e análise de dependências.
Erros comuns
- adicionar lockfile ao gitignore;
- usar
npm installno CI sem necessidade; - editar manualmente;
- ignorar conflitos;
- misturar lockfiles;
- não revisar mudanças transitivas;
- usar cache sem hash do arquivo;
- atualizar tudo em um único pull request.
Checklist para produção
- versione o lockfile;
- padronize Node e npm;
- use
npm ci; - revise diffs;
- execute testes;
- audite dependências;
- proteja branches;
- use cache por hash;
- não mantenha lockfiles concorrentes;
- teste imagem final.
Conclusão
Lockfile no Node.js é parte do código da aplicação. Ele registra a decisão concreta de dependências e torna instalações repetíveis, revisáveis e mais seguras.
Versione o arquivo, use npm ci em automações e atualize dependências em mudanças pequenas. A previsibilidade do build depende tanto do lockfile quanto dos testes e da política de revisão.
Consulte a documentação oficial do package-lock.json e a referência do npm ci.



