본문으로 건너뛰기
cccskills
무료GitHub에 공개

nextjs-data-fetching

Next.js AppRouter における、データフェッチング、データベースへのクエリ発行のベストプラクティス。データフェッチを伴う処理を実装、変更する場合はこのドキュメントを参照すること。

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

설치 방법 보기

포함된 파일(1)

  • SKILL.md4.8 KB

SKILL.md(원문)

설치하기 전에 에이전트에게 전달되는 지시 내용을 확인할 수 있습니다.

ここでのデータフェッチは以下のようなものを含む。

  • fetch を用いた API からのデータフェッチ
  • データベースへのクエリ発行(ORM などを活用した場合も同様)

Constitution

  • NEVER: layout.tsx では無いと UI が成立しないデータ以外のデータフェッチを行わないこと。
    • 例: セッションデータはほとんどのコンポーネントで使用することになるはずで、それがないと UI が成立しないことが多いため、layout.tsx でフェッチすることは許容する。
    • 例: プレイリストのデータなどほとんどのデータフェッチは page.tsx で行うべきである。これらは layout.tsx でフェッチする必要はない。
  • ALWAYS: Tanstack Query を使用してクライアントサイドでのデータフェッチはユーザーの操作による発火など、必要な場面でのみ採用すること。
  • ALWAYS: Tanstack Query を使用してクライアントサイドでのデータフェッチでページ読み込み時にもデータが必要な場合は、サーバーサイドで prefetch すること。詳細は Prefetching のセクションを参照。
  • ALWAYS: データフェッチは依存関係が無いものは並列で行うこと。サーバーサイドでは Promise.allSettled を使用して、クライアントサイドでは Tanstack Query の useQueries を使用して並列でデータフェッチを行うこと。

Server-side Data Fetching

サーバーサイドでのデータフェッチングは以下のようなコードで行う。 要点:

  • データフェッチを行うサーバーコンポーネントは Suspense でラップするか、ページ全体が loading の場合 loading.tsx を使用すること。
    • これにより、データフェッチでページ全体がブロックされることを防ぎ、TTFB の改善につながる。
  • Loading UI は下記のコードでは簡略化されているが、実際にはレイアウトシフトを防ぐために、適切にスケルトンなどを活用するべきである。
import { Suspense } from "react";

export function SomePage() {
  return (
    <>
      <Header /> 
      <Suspense fallback={<BarLoading />}>
        <Bar />
      </Suspense>
    </>
  );
}

export function BarLoading() {
  return <div>Loading...</div>;
}

export async function Bar() {
  const res = await fetch("https://example.com");
  const data = await res.json();

  return <div>{data}</div>;
}

Suspense

サーバーコンポーネントでのデータフェッチにおける Suspense の仕様に関しては、 Server-side Data Fetching セクションを参照。

以下ではクライアントサイドにおける Suspense の使用のガイドラインを示す。 要点は以下:

  • クライアントサイドでの useSuspenseQuery による Suspense の活用はで、このアプリケーションでは導入していないため、クライアントサイドでの Suspense の使用は推奨しない。
  • そもそも、クライアントサイドでの Suspense は Loading UI の実装が簡潔になる程度のメリットしか無い。
  • このアプリケーションでのクライアントサイドデータフェッチの Loading UI は、useQuery が返す、isLoading、isError、data などの状態を活用して実装することとする。

Prefetching

クライアントサイドでの Tanstack Query を使用したデータフェッチで、ページ読み込み時にもデータが必要な場合は、サーバーサイドで prefetch することが推奨される。 これにより、ユーザー操作の伴わない Tanstack Query のデータフェッチをサーバーサイドで行うことができ、クライアントに比べ比較的ネットワーク環境が安定しているサーバーサイドでデータフェッチを行うことで、パフォーマンスの向上につながる。

// page.tsx(サーバーコンポーネント)
import {
  dehydrate,
  HydrationBoundary,
  QueryClient,
} from "@tanstack/react-query";

export default async function Page() {
  const queryClient = new QueryClient();

  await queryClient.prefetchQuery({
    queryKey: ["posts"],
    queryFn: fetchPosts,
  });

  return (
    <HydrationBoundary state={dehydrate(queryClient)}>
      <Posts />
    </HydrationBoundary>
  );
}

// Posts.tsx
'use client';

export function Posts() {
  const { data } = useQuery({
    queryKey: ["posts"],
    queryFn: fetchPosts,
  });
  return <div>{data}</div>;
}

리뷰

아직 리뷰가 없습니다. 사용해 본 소감을 남겨 주세요.

댓글

로그인 없이 쓸 수 있습니다. 사용 후기, 질문, 작동하지 않은 환경 등을 편하게 남겨 주세요.

아직 댓글이 없습니다. 첫 댓글을 남겨 보세요.

보내면 바로 공개됩니다. 이메일 주소나 전화번호 같은 개인 정보는 쓰지 마세요. URL은 2개까지입니다.

0 / 1,000자

이 양식은 reCAPTCHA로 보호되며 Google 개인정보처리방침 및 서비스 약관이 적용됩니다.

같은 저장소의 스킬

app 側のページ実装を `@playlistwizard/ui` へページ単位で移行するための方針。`@/components/ui/*` import の置換、共通コンポーネント化、既存表示差分の抑制、packages/ui 側の variant 設計を伴う作業で参照すること。

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

suzuki3jp/PlaylistWizard152026년 10월 19일 업데이트

Skill for integrating Better Auth - the comprehensive TypeScript authentication framework.

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

suzuki3jp/PlaylistWizard152026년 10월 19일 업데이트

Skill for creating auth layers in TypeScript/JavaScript apps using Better Auth.

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

suzuki3jp/PlaylistWizard152026년 10월 19일 업데이트

ユーザーと対話しながら機能仕様を策定し、Notion に自動でドキュメント化するスキル。「仕様を作ろう」「スペックを書いて」「仕様を詰めよう」などの指示で呼び出される。

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

suzuki3jp/PlaylistWizard152026년 10월 19일 업데이트

git

무료

git に関する全ての操作やこのプロジェクトのgitに関する情報が欲しい時に呼び出されるスキル(branch, commit, push, pull, merge ...)

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

suzuki3jp/PlaylistWizard152026년 10월 19일 업데이트

github

무료

GitHub に関する全ての操作やこのプロジェクトの GitHub に関する情報が欲しい時に呼び出されるスキル(PR, Issue)

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

suzuki3jp/PlaylistWizard152026년 10월 19일 업데이트

suzuki3jp의 스킬 모두 보기

이 스킬의 문제 신고