Skip to content

next.js v15, react v19, typescript v5.5, vercel, zod, testing-library, vitest, eslint

Notifications You must be signed in to change notification settings

ueno-toshihiro/next-tutorial-2024

Repository files navigation

Next.js App Router Course - Starter

学習内容を記録するためのリポジトリです

  1. フォントとヒーローイメージ追加

  1. サイドバーとLink設定
  • dashboard のサイドバーと各ページの雛形
  • Link を a タグの代わりに使うことで、プリフェッチと部分レンダリングを可能にし、リンク押下時のブラウザ再レンダリングを防止し描画スピードに貢献している

  1. Postgresデータベースの作成後 seed 削除
  • vercel サイトで Postgresデータベースの作成
  • .env に必要項目追加
  • pnpm run dev 実行後、ブラウザで localhost:3000/seed を表示すると app/seed が実行され postgres にデータを追加した

  1. SQLでデータをfetchしてdashboardのUIに反映
  • サーバーサイドレンダリングではコンポーネントで直接SQLを書いてデータを取得後にHTMLとして完成したものがブラウザで表示される
  • データ操作もSQLにより行うことでクライアント側は何もしない(これを「サーバーコンポーネント」といって静的コンポーネントなのでデータが変わっても画面は変更されない)

  1. dashboard に loading 追加

  1. dashboard のローディングをスケルトンに変更
  • loading.tsx を関連するルート(ディレクトリ)に移動すると、その配下のコンポーネントだけ loading.tsx が表示されることで画面毎のローディングを指定できる

  • ルートグループを使用すると、URLパスの構造に影響を与えることなく、ファイルを論理的なグループにまとめることができます。括弧()を使用して新しいフォルダを作成すると、その名前はURLパスに含まれません。つまり、/dashboard/(overview)/page.tsxは /dashboardになります。 ここでは、loading.tsxがダッシュボードの概要ページにのみ適用されるように、ルートグループを使用しています。しかし、ルートグループを使用して、アプリケーションをセクションに分けたり(例えば、(マーケティング)ルートと(ショップ)ルート)、大規模なアプリケーションのためにチームごとに分けることもできます。


  1. dashboard の個別データを Suspense でラップ
  • 個別でデータを fetch すると全てのデータが揃わなくても dashboard が表示できる また、データを fetch する個別のコンポーネントに Suspense と fallback を指定することでデータを読み込まれた順に表示されるので全体の描画は早くなる

  1. パーシャルプリレンダリングの実装

  1. データ検索とクエリパラメータ設定
  • 検索入力欄に use-debounce ライブラリにより 300ms 間隔でデータを取得するように変更

  • 検索文字はSQLによりDBから都度データを取得する

  • 検索文字はクエリパラメータとしてURLでブラウザに保持しているため state を使わない

  • 備考

    • use client"- クライアント・コンポーネント指定で イベント・リスナーやフックを使うことができます
    • 検索入力欄の input に value を使わず defaultValue を使う理由 検索用の input はステートを使用しないので defaultValue を使用することができる。これは、ネイティブ入力が独自の状態を管理することを意味します。※ステートの代わりに検索クエリをURLに保存しているので問題ありません

  1. クエリパラメータを変更してデータ取得後にUIを変更するパターン
  • ページネーションの実装

  • React の state を使わずに ページング時にクエリパラメータを変更してデータを取得し、UIを書き換えている

  • 備考

    • クライアントの状態ではなく、URLの検索パラメータで検索とページネーションを処理している。
    • サーバー上のデータを取得しました。
    • useRouterルーターフックを使うことで、クライアント側でのトランジションがよりスムーズになります。
  • これらのパターンは、クライアントサイドのReactで作業するときに慣れ親しんだものとは異なるが、URL検索パラメータを使用し、この状態をサーバーに持ち上げる利点があるようだ


  1. フォームによりサーバーのデータとUIを更新
  • 追加・削除・変更 を フォームアクションからSQLによるデータ変更後、UIを更新する

  1. データ更新時のエラー処理画面追加
  • error を catch すると、Next.js は error.tsx コンポーネントを自動で表示する仕組みがある

  • NOTE

    • error.tsx ファイルは、ルートセグメントの UI 境界を定義するために使用できます。 これは予期しないエラーのためのキャッチオールとして機能し、ユーザーにフォールバックUIを表示することができます。
  • Error コンポーネントは、error, reset を引数として持っており、Next.js が自動で処理する。

    • error は javascript のネイティブErrorオブジェクト
    • reset は 関数でルートセグメントの再レンダリングを実行する

  1. Not Found ページ追加
  • Next.js で Not Found を表示するには

    • ルーティング(ディレクトリ配下)に not-found.tsx ファイルを作る 
    • next/navigation の notFound() 関数を起動
  • 備考

    • notFoundは error.tsxよりも優先されるので、より具体的なエラーに対処したい場合は、notFoundを使うことができる

  1. form のバリデーション
  • edit-form.tsxコンポーネントにuseActionStateを追加
  • zod でフォームのバリデーションとエラー時のラベルを指定
  • create-form.tsx の aria ラベルについて(アクセシビリティを向上)
    • aria-describedby="customer-error":これはselect要素とエラーメッセージコンテナとの関係を確立します。これは、id="customer-error"のコンテナがselect要素を記述していることを示します。スクリーン・リーダは、ユーザがエラーを通知するためにセレクト・ボックスと対話するときに、この説明を読みます。
    • id="customer-error":このid属性は、セレクト入力のエラーメッセージを保持する HTML 要素を一意に識別します。これは、aria-describedbyが関係を確立するために必要です。
    • aria-live="polite":div内のエラーが更新されたとき、スクリーン・リーダーはユーザーに丁寧に通知する必要があります。コンテンツが変更されたとき(たとえば、ユーザがエラーを修正したとき)、スクリーン・リーダーはこれらの変更をアナウンスしますが、ユーザの邪魔にならないように、ユーザがアイドルであるときに限ります。

  1. ログイン・ログアウト(認証)追加

  1. favicon と opengraph-image をヘッダーに追加
  • /app ルートに favicon, opengraph-image を移動
  • こうすると Next.jsは自動的にこれらのファイルを識別し、ファビコンとog画像として使用します

  1. 共通メタデータ追加

  1. 特定のページのメタデータを変更する
  • 個別ページのメタデータを変えたときは共通メタデータを上書きする

For more information, see the course curriculum on the Next.js Website.

About

next.js v15, react v19, typescript v5.5, vercel, zod, testing-library, vitest, eslint

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published