まず結論
lockfileは、実際に組み合わせた依存パッケージの版を記録するファイルです。 チームやCIで同じ依存関係を入れやすくします。

package.jsonだけでは足りない理由
package.json には ^1.2.0 のように許容範囲を書くことがあります。この範囲に新しい版が出ると、別の日に npm install した結果が変わることがあります。
package-lock.json には、解決された版と依存先の組み合わせが記録されます。npmでは通常、プロジェクトのlockfileをGitで共有します。
何を使うかは一つにそろえる
| パッケージマネージャー | 代表的なlockfile |
|---|---|
| npm | package-lock.json |
| pnpm | pnpm-lock.yaml |
| Yarn | yarn.lock |
同じプロジェクトで複数のlockfileを混ぜると、どれを正とするか分からなくなります。既存のプロジェクトが使うマネージャーを確認してから追加・更新します。
lockfileが変わった時に見ること
- 自分が追加・更新した依存関係に対応する差分か
- 意図しない多数の更新が混ざっていないか
package.jsonと矛盾していないか- CIではlockfileどおりにインストールできるか
lockfileを手で直すのではなく、使っているパッケージマネージャーのコマンドで更新します。
まとめ
lockfileは「依存関係をその時点で再現する記録」です。プロジェクトで一つのパッケージマネージャーを使い、package.json とlockfileをセットでレビューします。