はじめに
こんにちは、株式会社TOKOSのツキヤです!
先日(2024年10月末頃)、Next.jsのバージョン15がリリースされましたね!
本記事ではNext.jsのバージョン14から15のアップデート方法を記載し、気をつけるポイント等もまとめていきます💪
アップデート方法
codemodの実行
早速アップデートを行っていきます!
と言いましたが、実は下記コマンド1つでアップデート作業はほとんど完了してしまいます✨
npx @next/codemod@15.0.3 upgrade latest
上記コマンドを実行することで、Next.jsのバージョン「15.0.3」にアップデートするために必要な変更を対話形式で進めていきます!
まずはcodemod
を(一時的に)インストールして良いかを聞かれているので、「y
」で進めます!
Turbopackの使用
現在のReact及びNext.jsのバージョンが表示された上で、何やらWarningが出ていますね、、!
こちらに関しては、僕がpackage.json
内scripts
のdev
のコマンドををnext -p 8000
に変更しているために起きていそうです!
一旦このままのコマンドで行きたいので何も入力せずにEnterで進めます。
実際には、Next.js 15 からは開発環境でのTurbopackの使用が安定版となったため、そちらのコマンドを入れることを促すような対話になっていそうですね!
Turbopackを使用したい方はnext dev --turbo
というコマンドに変更してしまいましょう!
僕がコマンドをnext -p 8000
にしている理由は、localhost
で確認するポートを8000番に変更したいからです!
ソースコードの自動書き換え
次に、自動でソースコードを書き換えてる対象を選択します!
何やら3種類有りそうですね!
1つ目は、バージョン14では試験的な機能であったAPI Routeのedge設定「experimental-edge
」を「edge
」に変更するかどうからしいです!
自分は記述をしていないのでどちらでも良かったのですが、チェックは入れたままにします!
2つ目は、page.tsxがpropsとして受け取るRequest APIsが非同期になったので、それの自動書き換えを行ってくれるかどうかですね!
こちらはほとんどの人が関係あると思うので少し解説します。
バージョン14までは、下記コードのようにpage.tsxがpropsとして受け取るパスパラメータはクエリパラメータはそのまま使うことができていました!
export default async function UserDetailPage({
params,
}: {
params: { id: string }
}) {
const { id } = params
return (
<h1>ユーザーののIDは{id}です!</h1>
)
}
ですが、バージョン15では上記が非同期となるので下記のように書き換える必要があります!
export default async function UserDetailPage({
params,
}: {
params: Promise<{ id: string }>
}) {
const { id } = await params
return (
<h1>ユーザーののIDは{id}です!</h1>
)
}
CLIの話に戻ると、これにチェックを入れることで恐らく自動でソースコード内を書き換えてくれそうですね!!
3つ目は、NextRequest
のgeo
とip
という変数を使っている場合に"@vercel/functions"
というパッケージを入れてくれるような内容です。
こちらも自分には関係無さそうですが、チェックは入れたままにします!
上記設定でエンターを押して進めます!
React19のcodemod
次は、React19へのアップグレードに対する自動書き換えを行うかどうかの対話っぽそうですね!
Next.js15は、React19を内部的に使用することとなるので、合わせて行いたいところです。
なので、「Y
」を選択して進めましょう!
合わせて、React19の型周りについてもアップグレードするかどうかを聞かれるので、ここも「Y
」でいきます!
Vercelへのデプロイ、codemodのインストール
上記の入力が完了したら、諸々の書き換えを行ってくれます!
最後に、Vercelにデプロイするかどうかを聞かれるので、行いたい方は「Y
」を入力して下さい。
また、codemod自身をinstallするかどうかを尋ねられます。
オススメっぽそうなので「y
」で進めます!
以上でCLI上の操作が完了します✨
確認
動作完了後に差分を確認したところ、page.tsx系は結構変更が入っていました。
例えば、下記の様な感じになっていました!
params
の型にPromise
が追加され、10行目にてawait
を使って取り出していますね!
これを自動でやってくれるのは嬉しいです😊
僕が確認したプロジェクトでは、上記に関する変更がほとんどでした!
プロジェクトによっては、アップデートに関する工数をかなり削減できるのではないでしょうか🎉
おわりに
今回は下記記事に書いてある内容を参考にアップデート作業を行いました。
アップデート内容等の詳細が気になる方はぜひ読んでみてください!