Next.js: From Pages to App

Next.js で app directory が stable になったので移行してみた。

参考にした主な資料

詰まった点

パスパラメータの取得方法がよくわからない

最初

https://nextjs.org/docs/app/building-your-application/upgrading/app-router-migration#step-5-migrating-routing-hooks

これを見て usePathname() してパスを分割しないといけないのかなと思っていたが、

https://nextjs.org/docs/app/building-your-application/optimizing/metadata#dynamic-metadata

上記ページを見て page.tsx のデフォルトエクスポートしている関数が引数でパスパラメータを受け取れることを把握した。

type PageProps = {
  params: { blogKey: string }
}

export default function Page({ params }: PageProps) {
  const blogKey = params.blogKey
  // 以下略
}

こんな感じでいける。

クライアントコンポーネントから動的にページタイトルを編集する API が無い

公式のマイグレーションガイドには pages directory で使っていた next/headbuilt-in SEO support に変更しろと書いてある。

しかしその built-in SEO support というのはサーバーコンポーネントからしか使えない。そしてクライアントコンポーネントからページタイトル等を編集するにはどうすればいいかという情報がドキュメントを探しても見つからない。

ドキュメントを拡充してくれという issue もあった。

https://github.com/vercel/next.js/issues/48266

私はどうしてもユーザーの認証状態を使って取得したデータを元にページタイトルを編集したかったので、あれこれ探して Next.js の API は無いということを確信した後で原始的に document.title を直接いじることにした。

useEffect(() => {
if (data.name) {
    document.title = data.name
}
}, [data.name])

ただ page directory ではできていたことは、app directory でもできるようにしておいてほしい感がある。

コンパイルがはちゃめちゃに遅い

issue を漁ったけど自分のソースコードに適用できる解決策が見つからなかった。

特に特定のページのコンパイルがはちゃめちゃに遅くて初回画面遷移時にはフリーズしたかと思うほどだし、時々本当にフリーズするのでどうにか直ってほしい。

移行した感想

Chakra UI を使っている都合で基本的にクライアントコンポーネントにせざるを得ないし、コンパイルがはちゃめちゃに遅い問題がくっついてきたので、正直 app directory にはしなくてよかったと思う。

サーバーコンポーネントを活用する予定がないなら現状ではまだ pages directory のままのほうが良さそう。

以上