Nuxt.js で構築していたポートフォリオサイトを、Next.js の App Router を用いてリプレイスしました。
旧ポートフォリオのリポジトリはこちら
React フレームワークとして Next.js を選定した基準は以下の通りです。
Remix や Astro などと比較した結果、上記の条件を満たす Next.js を選択しました。
shadcn/ui を選んだ理由は以下です。
Chakra UI や Radix UI と比較した結果、現時点で最も多くの GitHub star を集めている shadcn/ui を採用しました。
shadcn/ui のコンポーネントが Tailwind CSS ベースであるため採用しました。
また、これまで Tailwind CSS を使用したことがなかったため、実際に試してみたい意図もありました。
旧ポートフォリオから使用している構成です。
Vercel の導入も検討しましたが、記事の更新頻度が低く ISR のメリットが少ないため、その代わり記事更新時に自動でビルドが走るよう CI/CD を組みました。
さらに、Lambda@Edge で URL の正規化処理も行い、URL 管理を最適化しました。
旧ポートフォリオから使用している構成です。
コンタクトフォームの入力を SES に連携し、メール送信を行っています。
旧ポートフォリオから使用している技術です。
Contentful の記事に更新があると Webhook を飛ばし、GitHub Actions でビルドが走るようにしました。
SSG でビルドする場合でも、App Router を用いることで以下の利点が得られると感じました。
fetch
を用いてデータフェッチが可能で、データ取得の管理がシンプルです。コンポーネントコードがプロジェクト内に直接配置されるため、node_modules から import する形式に比べてカスタマイズが容易でした。
Moblie 版のヘッダーメニューです。該当箇所
画面遷移時に Sheet コンポーネントが閉じて欲しかったのですが、そのままでは開きっぱなしです。
Server Component では画面遷移判定を取得することができなかったので、Client Component にして、usePathname
で path の変更を検知するようにしました。
コンタクトフォームです。該当箇所
useForm
が Server Component で使えなかったので、Client Component にしました。
この際、onSubmit を Server Action として扱おうとも思いましたが、SSG では Server Action が使えない (仕組みを考えれば当たり前ですが...) ので、Client Action としました。