42790
こんにちは。

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

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

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

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

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

よろしくお願いします。
CC BY-SA 3.0
2018-03-30T09:12:31.120
42788
2018-03-30T09:46:19.820
21047
question
javascript npm
npm package-lock.json がなぜ必要なのかがわからない
とても良い疑問点だと思います。結論から言うと、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>
CC BY-SA 3.0
2018-03-30T09:46:19.820
42790
2018-03-30T09:46:19.820
19110
42788
answer