npm update でメジャーバージョンに更新できない
npm update は package.json に書かれた semver レンジ(^ や ~)の範囲内でしか更新しない仕様で、メジャーバージョンの壁は越えない。
メジャー更新は npm install <pkg>@latest でレンジ自体を書き換える。
#npm#npm-update#semver#package-json#outdated
公開:
要約
npm update を実行してもメジャーバージョンに更新できないのは、不具合ではなく仕様です。
npm update は「package.json の semver レンジを満たす範囲での最新」までしか更新しません(公式ドキュメント)。
既定の ^1.2.3(キャレット)はメジャーバージョン 1 の範囲を意味するため、2.0.0 が出ていても上がりません。
メジャーバージョンを上げたいときは、レンジそのものを書き換える必要があります。
よくある原因
- キャレットレンジの上限:
^1.2.3は「1.2.3 以上 2.0.0 未満」。
npm update が更新するのはこの範囲の最新まで。 - チルダレンジの上限:
~1.2.3は「1.2.3 以上 1.3.0 未満」。
パッチバージョンしか上がらない。 - 固定バージョン指定: レンジ記号なしの
1.2.3は完全固定で、npm update の対象にならない。 - peer 依存の制約: レンジ内でも、他のパッケージが古いバージョンを peerDependencies で要求していると解決が止まる。
解決策
1. @latest でレンジごと書き換える
npm install react@latest react-dom@latestnpm install <package>@latest は package.json のレンジを最新バージョン基準(例: ^19.0.0)へ書き換えつつインストールします。
メジャー更新の正攻法です。
2. npm outdated で現状を確認する
npm outdatedPackage Current Wanted Latest Location
react 18.2.0 18.3.1 19.1.0 node_modules/reactWanted は「現在のレンジ内での最新」、Latest は「レジストリ上の最新」。
Wanted と Latest がズレているパッケージが、レンジの壁で止まっているものです。
3. レンジを手で書き換える
package.json を直接 "react": "^19.0.0" のように編集して npm install を実行しても同じ結果になります。
複数パッケージを一括でメジャー更新したい場合に管理しやすい方法です。
なお、メジャー更新は破壊的変更を含みます。
更新前に各パッケージのリリースノートと移行ガイドを確認してください。