npm package-lock.json の役割り

npm init した時に出来るpackage.jsonについての解説はよく載っているが、同時に出来るpackage-lock.jsonがなぜ必要なのか分からない。 調べたらStack Overflowにとてもいい解説が載っていたのでメモっておく。

ja.stackoverflow.com

npm package-lock.json がなぜ必要なのかがわからない

Q: こんにちは。

node.js の npm をモジュールインストール時に使います。 あまり使いこなしているということはないのですが package.json については理解しています。

最近のバージョンでは、 package-lock.json も付属するようになっているのですが、 この、package-lock.json の役割がわかりません。

バージョンを固定化する、みたいに書かれているページをいくつか見ましたが モジュールのバージョンは、package.json にも書かれているので package-lock.json がなくてもモジュールのバージョンは正しくインストールされるのではないでしょうか?

package-lock.json と package.json との違い、 package-lock.json がなぜ必要だったのか、なくて困る場面 などを、教えて欲しいです。

あるいは分かりやすい解説などがありましたらリンクを教えてください。

よろしくお願いします。


A: とても良い疑問点だと思います。結論から言うと、package-lock.json は必要です。ネストした依存関係があるときに違いが出てくる場合があります。

package.json では、依存しているプロジェクトのバージョンに対する条件を指定できます。この際、1.1.0 だとか <2.0.0 のような指定ができることに注意してください。したがって、指定した範囲内で依存パッケージがアップグレードされた際に、依存パッケージが 依存しているパッケージのバージョン情報が変わる可能性があります。つまり、package.json だけでは今手元にある node_modules を完璧に再現できるとは限らないのです。

package-lock.json はこの問題を解決します。つまり、node_modules の木構造におけるバージョン情報を全て正確に記録することによって、第三者が node_modules を完璧に再現できるようにし、開発者側で成功したビルドがユーザー側でも高い確率で成功するようにします。これは、継続的インテグレーションの確実性を上げるのにも便利です> なお、詳細な説明が公式ドキュメントにもあります: (https://docs.npmjs.com/files/package-lock.json)