Communitygithub.com

sakilanwar12/nextjs-typescript-skills

Next.js App Router 페이지, 레이아웃, 로딩/에러 상태, 라우트 그룹, 병렬 또는 인터셉팅 라우트를 구축할 때 사용합니다. 파일 규칙, RSC 경계, 네비게이션을 다룹니다.

nextjs-typescript-skills란 무엇인가요?

이 스킬은 Next.js 14+ App Router와 TypeScript를 사용하는 개발자를 위한 안내서입니다. `app/` 디렉토리 기반의 파일 규칙(레이아웃, 페이지, 로딩, 에러, not-found, 라우트 핸들러, 동적 라우트, 라우트 그룹, 병렬 및 인터셉팅 라우트)을 상세히 설명합니다. 특히 React Server Components(RSC)와 Client Components의 경계를 명확히 하고, `'use client'` 지시어를 필요한 곳에만 사용하여 클라이언트 번들을 최적화하는 방법을 강조합니다. Next 15의 비동기 `params`/`searchParams` 처리, `next/link` 및 `next/navigation` 사용법, 그리고 파일 배치 규칙을 코드 예제와 함께 제공합니다. 이 스킬은 Claude Code, Cursor, Codex 등 AI 어시스턴트가 Next.js 프로젝트에서 정확하고 모범 사례를 따르는 코드를 생성하도록 돕습니다.

지원 대상~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/sakilanwar12/nextjs-typescript-skills/tree/HEAD/skills/nextjs-app-router

즐겨 사용하는 AI에게 물어보기

이 에이전트 스킬이 미리 로드된 새 채팅을 엽니다.

문서

Next.js App Router

Next.js 14+ 및 app/ 디렉토리와 TypeScript에 적용됩니다.

파일 규칙

  • app/layout.tsx — 필수 루트 레이아웃. <html>과 <body>를 포함해야 합니다.
  • app/page.tsx — 라우트 진입점. 기본적으로 React Server Component(RSC)입니다.
  • app/loading.tsx — 세그먼트에 대한 스트리밍 폴백입니다.
  • app/error.tsx — 클라이언트 컴포넌트('use client')여야 하며, { error, reset }을 받습니다.
  • app/not-found.tsx — 404 UI입니다.
  • app/route.ts — 라우트 핸들러(API). GET, POST 등을 내보냅니다.
  • 동적 라우트: app/blog/[slug]/page.tsx는 { params: { slug: string } }을 받습니다.
  • 그룹: app/(marketing)/about/page.tsx — URL에 영향을 주지 않습니다.
  • 병렬: app/@modal/page.tsx + layout({ modal }). 인터셉팅: app/(.)photo/[id]/page.tsx.

규칙

  1. 기본적으로 서버 컴포넌트입니다. 훅, 이벤트 또는 브라우저 API가 필요한 경우에만 'use client'를 추가하세요. 클라이언트 경계를 작게 유지하고 리프(leaf) 컴포넌트로 밀어 넣으세요.
  2. params와 searchParams는 Next 15에서 비동기(async)입니다: await params.
  3. 서버 전용 기능을 사용하는 서버 컴포넌트를 클라이언트 컴포넌트에 직접 가져오지 마세요. 대신 children/props로 전달하세요.
  4. 네비게이션에는 next/link를 사용하고, next/navigation(useRouter, usePathname)은 클라이언트 컴포넌트에서만 사용하세요. 서버 컴포넌트에서는 next/navigation의 redirect() / notFound()를 사용하세요.
  5. 파일 배치: 세그먼트별로 page.tsx, loading.tsx, error.tsx를 둡니다. 공유 UI는 라우팅되지 않는 한 app/이 아닌 components/에 둡니다.

패턴

// app/blog/[slug]/page.tsx — Next 15 async params
type Props = { params: Promise<{ slug: string }> };

export default async function BlogPost({ params }: Props) {
  const { slug } = await params;
  const post = await getPost(slug);
  if (!post) notFound();
  return <article>{post.title}</article>;
}

export async function generateStaticParams() {
  const slugs = await getAllSlugs();
  return slugs.map((slug) => ({ slug }));
}
// app/error.tsx — 반드시 Client Component여야 함
'use client';
export default function Error({ error, reset }: { error: Error; reset: () => void }) {
  return (
    <div>
      <h2>문제가 발생했습니다</h2>
      <button onClick={() => reset()}>다시 시도</button>
    </div>
  );
}
// app/layout.tsx
export default function RootLayout({ children }: { children: React.ReactNode }) {
  return (
    <html lang="en">
      <body>{children}</body>
    </html>
  );
}

체크리스트

  • 올바른 파일 이름과 세그먼트 위치인가요?
  • 필요한 곳에만 Client 지시어를 사용했나요?
  • 비동기 세그먼트에 loading.tsx / error.tsx가 있나요?
  • SEO가 중요한 경우 generateStaticParams + generateMetadata를 사용했나요?
  • next/router(pages-router 임포트)의 useRouter를 사용하지 않았나요?

Individual skills in this repo

This repo contains 4 individual skills — each has its own dedicated page.

관련 스킬