◆ 普通の install で lock ファイルが参照されるようになってた
◆ clean-install は node_modules フォルダを消して完全にインストールし直す場合のみで良さそう

昔から npm は使いづらいし遅いし機能足りないしでずっと yarn を使ってました
最近は差は小さくなってるとは聞いてましたが corepack で簡単に yarn に切り替えられるので npm を使う理由もないしなと yarn のままでした

一応 lock ファイルが npm のパッケージを操作するときは npm を使わざるを得ません
稀に使ってみてもそんなに使いやすくないし clean-install で一旦 node_modules を全消しするのでかなり遅いです
clean-install という言葉的には正しい動作なのですが npm は歴史的なアレで install コマンドでは lock ファイルを無視して package.json に記載の範囲で最新版をインストールします
それは install ではなく update コマンドのやることだろうとは思うものの 当時は lock ファイルの考えがなかった?(あまり覚えてない)のかそうなってます
その対処に出てきたのが clean-install コマンドで このコマンドでは lock ファイルのとおりにインストールしてくれます
でも求めてるのは 単純に lock ファイルのとおりにインストールするだけで clean してほしいわけではありません

これも npm を使わない理由だったのですが 最近見かけた npm の使い方記事では clean-install は使わず普通に install でした
バージョンを固定することに興味がない人は別に install でもいいし 使わない選択もありなのかも?くらいに思って深く気にしてませんでした
npm 記事を一度見たからか それからしばらくおすすめに npm コマンド系のページが出てくる頻度が増えていくつか見ましたが clean-install は触れられてません
また lock ファイルが新しくなってどうこう言うような内容も見かけました

もしかして lock ファイルが新しくなったことで install の仕様も変わったのでしょうか?
互換性的にそんな大きな変更するなんて期待してなかったのですが ググって出てきた issue を見ると v7 で変わったような話が出てます
https://github.com/npm/cli/issues/564

今の最新版は v8.11 なのでもう結構前のようです
実際のところどうなってるのか試してみます

lock ファイル

使う環境の npm バージョンは 8.3.1 でした

[root@103042353a59 a]# npm -v
8.3.1

まずは新しくなったらしい lock ファイルがどんなのか見てみます
依存関係が多いと長くなるので少ないものということで lit-html にしました

[root@103042353a59 a]# echo "{}" > package.json
[root@103042353a59 a]# npm install lit-html

added 2 packages, and audited 3 packages in 735ms

found 0 vulnerabilities

[root@103042353a59 a]# cat package.json
{
"dependencies": {
"lit-html": "^2.2.5"
}
}

[root@103042353a59 a]# cat package-lock.json
{
"name": "a",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"dependencies": {
"lit-html": "^2.2.5"
}
},
"node_modules/@types/trusted-types": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.2.tgz",
"integrity": "sha512-F5DIZ36YVLE+PN+Zwws4kJogq47hNgX3Nx6WyDJ3kcplxyke3XIzB8uK5n/Lpm1HBsbGzd6nmGehL8cPekP+Tg=="
},
"node_modules/lit-html": {
"version": "2.2.5",
"resolved": "https://registry.npmjs.org/lit-html/-/lit-html-2.2.5.tgz",
"integrity": "sha512-e56Y9V+RNA+SGYsWP2DGb/wad5Ccd3xUZYjmcmbeZcnc0wP4zFQRXeXn7W3bbfBekmHDK2dOnuYNYkg0bQjh/w==",
"dependencies": {
"@types/trusted-types": "^2.0.2"
}
}
},
"dependencies": {
"@types/trusted-types": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.2.tgz",
"integrity": "sha512-F5DIZ36YVLE+PN+Zwws4kJogq47hNgX3Nx6WyDJ3kcplxyke3XIzB8uK5n/Lpm1HBsbGzd6nmGehL8cPekP+Tg=="
},
"lit-html": {
"version": "2.2.5",
"resolved": "https://registry.npmjs.org/lit-html/-/lit-html-2.2.5.tgz",
"integrity": "sha512-e56Y9V+RNA+SGYsWP2DGb/wad5Ccd3xUZYjmcmbeZcnc0wP4zFQRXeXn7W3bbfBekmHDK2dOnuYNYkg0bQjh/w==",
"requires": {
"@types/trusted-types": "^2.0.2"
}
}
}
}

packages と dependencies で同じ情報を保持していてすごく冗長に感じます
比較用に yarn の lock ファイルも見てみます

[root@103042353a59 a]# cat yarn.lock
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
# yarn lockfile v1


"@types/trusted-types@^2.0.2":
version "2.0.2"
resolved "https://registry.yarnpkg.com/@types/trusted-types/-/trusted-types-2.0.2.tgz#fc25ad9943bcac11cceb8168db4f275e0e72e756"
integrity sha512-F5DIZ36YVLE+PN+Zwws4kJogq47hNgX3Nx6WyDJ3kcplxyke3XIzB8uK5n/Lpm1HBsbGzd6nmGehL8cPekP+Tg==

lit-html@^2.2.5:
version "2.2.5"
resolved "https://registry.yarnpkg.com/lit-html/-/lit-html-2.2.5.tgz#e2b4fbdb3b57e38a3bce23c8473d72ba0e652ed8"
integrity sha512-e56Y9V+RNA+SGYsWP2DGb/wad5Ccd3xUZYjmcmbeZcnc0wP4zFQRXeXn7W3bbfBekmHDK2dOnuYNYkg0bQjh/w==
dependencies:
"@types/trusted-types" "^2.0.2"

とてもシンプルです
ちなみに pnp が有効な yarn3 の場合はこうなりました

[root@103042353a59 a]# cat yarn.lock
# This file is generated by running "yarn install" inside your project.
# Manual changes might be lost - proceed with caution!

__metadata:
version: 6
cacheKey: 8

"@types/trusted-types@npm:^2.0.2":
version: 2.0.2
resolution: "@types/trusted-types@npm:2.0.2"
checksum: 3371eef5f1c50e1c3c07a127c1207b262ba65b83dd167a1c460fc1b135a3fb0c97b9f508efebd383f239cc5dd5b7169093686a692a501fde9c3f7208657d9b0d
languageName: node
linkType: hard

"lit-html@npm:^2.2.5":
version: 2.2.5
resolution: "lit-html@npm:2.2.5"
dependencies:
"@types/trusted-types": ^2.0.2
checksum: 688fed0a5cf16cd08d837ba89c894162e38798117bcdf8c588254920b4a5448c1a367c2f0ca5e88307a9b1293995de335cf60f0a43b4d6c521089ac3ae0154b1
languageName: node
linkType: hard

"root-workspace-0b6124@workspace:.":
version: 0.0.0-use.local
resolution: "root-workspace-0b6124@workspace:."
dependencies:
lit-html: ^2.2.5
languageName: unknown
linkType: soft

1 の頃よりは長くなってますが npm に比べれば短いです

npm install 時のバージョン

npm install で lock ファイルのバージョンになるのか確認します
lit-html を少し古めの 2.0.0 でインストールして lock ファイルを作ります

{
"name": "a",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"dependencies": {
"lit-html": "^2.0.0"
}
},
"node_modules/@types/trusted-types": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.2.tgz",
"integrity": "sha512-F5DIZ36YVLE+PN+Zwws4kJogq47hNgX3Nx6WyDJ3kcplxyke3XIzB8uK5n/Lpm1HBsbGzd6nmGehL8cPekP+Tg=="
},
"node_modules/lit-html": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/lit-html/-/lit-html-2.0.0.tgz",
"integrity": "sha512-tJsCapCmc0vtLj6harqd6HfCxnlt/RSkgowtz4SC9dFE3nSL38Tb33I5HMDiyJsRjQZRTgpVsahrnDrR9wg27w==",
"dependencies": {
"@types/trusted-types": "^2.0.2"
}
}
},
"dependencies": {
"@types/trusted-types": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.2.tgz",
"integrity": "sha512-F5DIZ36YVLE+PN+Zwws4kJogq47hNgX3Nx6WyDJ3kcplxyke3XIzB8uK5n/Lpm1HBsbGzd6nmGehL8cPekP+Tg=="
},
"lit-html": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/lit-html/-/lit-html-2.0.0.tgz",
"integrity": "sha512-tJsCapCmc0vtLj6harqd6HfCxnlt/RSkgowtz4SC9dFE3nSL38Tb33I5HMDiyJsRjQZRTgpVsahrnDrR9wg27w==",
"requires": {
"@types/trusted-types": "^2.0.2"
}
}
}
}

2.0.0 になってます
この状態で node_modules を消して npm install します
これまでの動きだと 2.0.0 より新しいバージョンがインストールされて lock ファイルの中身も変更されるはずです

[root@103042353a59 a]# rm -rf node_modules/
[root@103042353a59 a]# npm install

added 2 packages, and audited 3 packages in 693ms

found 0 vulnerabilities
[root@103042353a59 a]# cat package-lock.json
{
"name": "a",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"dependencies": {
"lit-html": "^2.0.0"
}
},
"node_modules/@types/trusted-types": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.2.tgz",
"integrity": "sha512-F5DIZ36YVLE+PN+Zwws4kJogq47hNgX3Nx6WyDJ3kcplxyke3XIzB8uK5n/Lpm1HBsbGzd6nmGehL8cPekP+Tg=="
},
"node_modules/lit-html": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/lit-html/-/lit-html-2.0.0.tgz",
"integrity": "sha512-tJsCapCmc0vtLj6harqd6HfCxnlt/RSkgowtz4SC9dFE3nSL38Tb33I5HMDiyJsRjQZRTgpVsahrnDrR9wg27w==",
"dependencies": {
"@types/trusted-types": "^2.0.2"
}
}
},
"dependencies": {
"@types/trusted-types": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.2.tgz",
"integrity": "sha512-F5DIZ36YVLE+PN+Zwws4kJogq47hNgX3Nx6WyDJ3kcplxyke3XIzB8uK5n/Lpm1HBsbGzd6nmGehL8cPekP+Tg=="
},
"lit-html": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/lit-html/-/lit-html-2.0.0.tgz",
"integrity": "sha512-tJsCapCmc0vtLj6harqd6HfCxnlt/RSkgowtz4SC9dFE3nSL38Tb33I5HMDiyJsRjQZRTgpVsahrnDrR9wg27w==",
"requires": {
"@types/trusted-types": "^2.0.2"
}
}
}
}

[root@103042353a59 a]# node -p "require('./node_modules/lit-html/package.json').version"
2.0.0

lock ファイルのバージョンがインストールされて lock ファイルもそのままです

一応依存関係でインストールされる @types/trusted-types でも確認してみました
こっちも 2.0.0 としてインストールして lock ファイルを用意し npm install を行います
結果 こっちも lock ファイルどおりの 2.0.0 でインストールされました

今は npm で clean-install は不要で 単純に install で良くなってたようです
今後 clean-install を使うのは本当の意味で clean してほしい場合のみですね