Package.json and Package-lock.json
- Package.json and Package-lock.json
📦 package.json e package-lock.json
Você provavelmente já se deparou com o arquivo package-lock.json se trabalha com projetos que utilizam Node.js.
Neste artigo, veremos o que é o package-lock.json, por que ele é necessário e como ele difere do package.json.
🧾 O que é o arquivo package.json?
O package.json é um arquivo JSON localizado no diretório raiz de um projeto Node.js.
Ele contém metadados sobre o projeto (nome, versão, autor, scripts, etc.) e lista todas as dependências instaladas com o NPM.
Sempre que instalamos um pacote usando npm install, o package.json é atualizado com o nome do pacote e sua versão, seguindo a convenção semver.
🔢 O que é SemVer?
O SemVer (Semantic Versioning) é o padrão usado pelo NPM para definir versões de pacotes. Cada versão segue o formato:
x.y.z
Onde:
- x — versão major (grande): mudanças incompatíveis.
- y — versão minor (menor): novas funcionalidades compatíveis.
- z — versão patch: correções de bugs.
Exemplo:
- Incrementar major: mudanças grandes ou que quebram compatibilidade.
- Incrementar minor: novas funcionalidades compatíveis.
- Incrementar patch: apenas correções.
🔣 Símbolos de versão no NPM
O NPM utiliza símbolos especiais antes das versões no package.json para definir regras de atualização quando executamos npm update ou npm install.
Os dois mais comuns são:
- ^ (caret)
- ~ (til)
🟩 ^ (caret)
Regra: permite atualizações de minor e patch, mas não de major.
Exemplo:
"abc": "^13.1.0"
Com isso, o NPM pode atualizar para:
13.2.0, 13.3.0, 13.3.1, ...
Mas não para:
14.0.0
🟦 ~ (til)
Regra: permite apenas atualizações de patch.
Exemplo:
"abc": "~13.1.0"
Com isso, o NPM pode atualizar para:
13.1.1, 13.1.2, ...
Mas não para:
13.2.0 ou 14.0.0
💡 Por padrão, o NPM usa o símbolo
^ao instalar pacotes.
⚠️ O problema sem o package-lock.json
Considere o seguinte cenário:
-
O Desenvolvedor A instala o pacote
"abc"na versão 2.1.1 → Nopackage.jsonfica:"abc": "^2.1.1" -
Três meses depois, o Desenvolvedor B clona o projeto e executa
npm install. Nesse meio tempo, novas versões de"abc"foram lançadas:2.1.3, 2.1.5, 2.2.1, 2.2.6, 3.0.0, 3.0.1
Como a regra ^2.1.1 permite atualizações de minor e patch, o NPM instala a versão 2.2.6 (a mais recente compatível).
🔸 Resultado:
- Desenvolvedor A usa a 2.1.1
- Desenvolvedor B usa a 2.2.6
Mesmo com o mesmo package.json, ambos têm versões diferentes, o que pode causar erros e inconsistências no projeto.
🔒 O que é o arquivo package-lock.json?
O package-lock.json é a versão bloqueada do package.json.
Ele é gerado automaticamente sempre que instalamos, removemos ou atualizamos pacotes com o NPM.
Sua função principal é registrar as versões exatas dos pacotes instalados — incluindo subdependências (dependências das dependências).
⚙️ Como o package-lock.json funciona?
Ao executar npm install, o NPM:
- Lê o
package.jsonpara saber quais pacotes instalar. - Verifica o
package-lock.jsonpara saber quais versões exatas usar.
Se a versão no package-lock.json for compatível com o package.json (seguindo o SemVer), o NPM instala exatamente essa versão.
🧩 Exemplo prático
-
Desenvolvedor A
-
Instala
"abc"na versão 2.1.1. -
O
package.jsonfica com:"abc": "^2.1.1" -
O
package-lock.jsonregistra:"abc": "2.1.1"
-
-
Três meses depois, Desenvolvedor B
- Clona o projeto e executa
npm install. - O NPM encontra
"abc"nopackage-lock.jsoncom a versão 2.1.1, verifica que é compatível com^2.1.1, e instala a mesma versão. - Agora ambos usam a versão 2.1.1 → sem conflitos ✅
- Clona o projeto e executa
Se o package-lock.json não existisse, o NPM instalaria a versão mais recente compatível (2.2.6), recriando o problema inicial.
🧭 Conclusão
✔️ O arquivo package-lock.json garante que todas as instalações (npm install) resultem nas mesmas versões de pacotes, em qualquer máquina.
📌 Boas práticas:
- Sempre versione o arquivo
package-lock.jsonjunto com o código no repositório. Assim, todos os desenvolvedores e pipelines CI/CD usarão as mesmas versões. - Não edite o
package-lock.jsonmanualmente — ele é gerenciado automaticamente pelo NPM. - Faça atualizações de dependências apenas alterando o
package.json.
🧠 Em resumo
| Arquivo | Função | Geração | O que contém |
|---|---|---|---|
| package.json | Define dependências e metadados do projeto | Manual | Versões em SemVer (ex: ^1.2.3) |
| package-lock.json | Bloqueia versões exatas das dependências | Automática | Versões específicas instaladas (ex: 1.2.3) |