できない.dev

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. キャレットレンジの上限: ^1.2.3 は「1.2.3 以上 2.0.0 未満」。
    npm update が更新するのはこの範囲の最新まで。
  2. チルダレンジの上限: ~1.2.3 は「1.2.3 以上 1.3.0 未満」。
    パッチバージョンしか上がらない。
  3. 固定バージョン指定: レンジ記号なしの 1.2.3 は完全固定で、npm update の対象にならない。
  4. peer 依存の制約: レンジ内でも、他のパッケージが古いバージョンを peerDependencies で要求していると解決が止まる。

解決策

1. @latest でレンジごと書き換える

npm install react@latest react-dom@latest

npm install <package>@latest は package.json のレンジを最新バージョン基準(例: ^19.0.0)へ書き換えつつインストールします。
メジャー更新の正攻法です。

2. npm outdated で現状を確認する

npm outdated
Package  Current  Wanted  Latest  Location
react    18.2.0   18.3.1  19.1.0  node_modules/react

Wanted は「現在のレンジ内での最新」、Latest は「レジストリ上の最新」。
Wanted と Latest がズレているパッケージが、レンジの壁で止まっているものです。

3. レンジを手で書き換える

package.json を直接 "react": "^19.0.0" のように編集して npm install を実行しても同じ結果になります。
複数パッケージを一括でメジャー更新したい場合に管理しやすい方法です。

なお、メジャー更新は破壊的変更を含みます。
更新前に各パッケージのリリースノートと移行ガイドを確認してください。

この記事は役立ちましたか?