at backyard

Color my life with the chaos of trouble.

package-lock.jsonの"lockfileVersion": 2について

目次

【最初に結論】package-lock.jsonの"lockfileVersion"はどちらを使えば良い?

lockfileVersion2になったのはnpmのversion 7から。 それを踏まえて、下記のように挙動が変わる。

  • npm 6を利用しているとき
    • lockfileVersion1 のときに npm install をしても問題はない
    • lockfileVersion2 のときに npm install をするとupdateを促される。そして lockfileVersion1 に変更される
  • npm 7を利用しているとき
    • lockfileVersion1 のときに npm install をすると警告が出る。そして lockfileVersion2 に変更される
    • lockfileVersion2 のときに npm install をしても問題はない

チーム開発ではnpmのバージョンを揃えるようにする

lockfileVersionが2のほうがパフォーマンスが向上しているが、例えばチーム開発のときはnpmのversionを揃えて開発をするようにする。 でないと無駄に package-lock.json の内容が書き換わるという面倒な事態になる。

オープンソース開発ではlockfileVersion:2 に移行していってもよさそう?

Node.jsの現在のLTSのバージョンはv16になっており、こちらではデフォルトでnpm v8が採用されている。

node/CHANGELOG_V16.md at master · nodejs/node · GitHub

そのため、オープンソース開発などではこれから lockfileVersion: 2package-lock.json を見かけることが多くなってくると思われる。

特別な理由がない限り、メインで利用するNode.jsのversionは上がっていくので、私自身のリポジトリでも lockfileVersion: 2 に移行していこうと考えている。

実際に以前公開した、i18n用のシンプルでミニマムなReact hooksライブラリである use-mini18n では少し前に lockfileVersion2 にあげている。

github.com

まえがき

少し前のことだが、npmのversionを上げてnpmがv8になってから、npm installを行うと、package-lock.jsonlockfileVersion2 になっていた。

lockfileVersion: 2 とはなんぞや?と思い、公式ドキュメントで調べてみたところ、どうやら lockfileVersion: 2 への変更はnpmのversion 7から行われていたようだ。

package-lock.json | npm Docs

なぜ lockfileVersion のバージョンが上がったのかというところだが、これはパフォーマンス向上のためというのが理由のよう。

As of npm v7, lockfiles include enough information to gain a complete picture of the package tree, reducing the need to read package.json files, and allowing for significant performance improvements.

適用されるlockfileVersionとnpmの関係

調べてみたところ、lockfileVersionはv3まであるらしいが、これはv1との後方互換性がないものらしいので、利用するとしてもv2までにとどめておいたほうが良さそう。

  • v1: npm v5 および v6 で使用されるpackage-lock.jsonのバージョン
  • v2: npm v7(v8もこれ) で使用されているpackage-lock.jsonで、v1 のロックファイルとの後方互換性がある
  • v3: npm v7(v8もこれ) で使用されるロックファイルのバージョンで、後方互換性はない。

参考になる日本語の記事

lockfileVersionについて少し調べたことについて備忘録がてら書いていたが、ここまで書いたところで、日本語で書かれたQiitaの記事を見つけた。

qiita.com

色々と網羅的に書いてあるので、詳細を知りたい方はこちらのポストを読んでみることをおすすめします。