はじめに
Web開発をしているとき、ふと「package-lock.json
って何のためにあるんだろう?」と思うことがありませんか?
package.json
はインストールしたパッケージを管理してくれているのはなんとなくわかりますが、package-lock.json
の役割は少し分かりづらいですよね。
そこで今回は、package.json
とpackage-lock.json
の役割や違いについて解説します。
両者の違い
簡単に言えば、package.json
は依存パッケージの「概要」を管理するファイルであり、package-lock.json
は実際にインストールされた「具体的なバージョン」を記録するファイルです。
package.json
については比較的わかりやすいですが、package-lock.json
が「具体的なバージョン」を記録するとはどういうことなのか、イメージがつかない方も多いと思います。
package-lock.jsonがないとどうなる?
package-lock.json
の役割をイメージしやすくするために、もしこれが存在しなかった場合の問題について説明します。
たとえば、あなたがqiitan
というパッケージをインストールしたとします。
$ npm i qiitan
すると、package.json
には以下のように記載されます。
{
"dependencies": {
"qiitan": "^4.17.20"
}
}
この時点では、互換性のある最新バージョン(例えば4.17.21
)がインストールされ、node_modules
に保存されます。
その後、このプロジェクトをGitHubにアップロードし、しばらく経った後に別の開発者がコードをクローンして$ npm i
を実行したとしましょう。このとき、最新の互換バージョン(例えば4.18.0
)がインストールされ、動作に不具合が発生する可能性があります。
これは、package.json
の^4.17.20
という記述がセマンティックバージョニングに基づいており、4.x.x
の範囲内で最新のバージョンをインストールする仕様だからです。
このような問題を防ぐため、「その時点でインストールされた正確なバージョン」を記録するpackage-lock.json
が必要になるのです。
{
"dependencies": {
"qiitan": {
"version": "4.17.21",
"resolved": "https://registry.npmjs.org/qiitan/-/qiitan-4.17.21.tgz",
"integrity": "sha512-..."
}
}
}
これにより、他の開発者が同じリポジトリをクローンして$ npm i
を実行しても、確実に4.17.21
がインストールされます。
package.jsonはいらないのでは?
ここまで読んで、「それなら最初から正確なバージョンを記録すればいいのでは?」と疑問に思ったかもしれません。
しかし、package.json
には「概要」の管理という重要な役割があります。これにより、必要なライブラリやプロジェクトの基本情報を他の開発者やツールが把握しやすくなります。また、package-lock.json
は情報量が多く、簡単に人間が読むには適していません。
さらに、セマンティックバージョニングのおかげで、適切なアップデートを管理しやすいという利点もあります。加えて、npm run dev
のようなスクリプトの定義にもpackage.json
が使用されるため、プロジェクト全体の管理に欠かせない存在です。
まとめ
今回は、package.json
とpackage-lock.json
の違いについて解説しました。普段意識せずに使っているこれらのファイルが、開発を快適に進めるために重要な役割を果たしているのは驚きですね。これからも、開発に役立つ知識を発信していければと思います。