본문으로 건너뛰기

Next.js와 shadcn/ui로 개발 블로그 만들기

GitHub Pages에 Next.js와 shadcn/ui를 사용하여 정적 블로그를 구축하는 과정을 공유합니다.

2024년 1월 15일3 min read

안녕하세요! 이번 포스트에서는 Next.js와 shadcn/ui를 사용하여 GitHub Pages에 정적 블로그를 구축하는 과정을 공유하려고 합니다.

왜 Next.js와 GitHub Pages인가?

Next.js는 React 기반의 프레임워크로, 정적 사이트 생성(SSG) 기능을 제공합니다. GitHub Pages는 무료로 정적 웹사이트를 호스팅할 수 있는 서비스입니다. 이 둘을 조합하면 비용 없이 고성능의 블로그를 운영할 수 있습니다.

주요 기능

우리가 구현한 블로그의 주요 기능은 다음과 같습니다:

  • MDX 지원: Markdown에 React 컴포넌트를 포함할 수 있습니다
  • 다크 모드: 사용자 선호도에 따른 테마 전환
  • 태그 및 카테고리: 포스트 분류 및 탐색
  • 반응형 디자인: 모든 디바이스에서 최적화된 UI
  • 코드 하이라이팅: Prism을 사용한 코드 블록 스타일링

기술 스택

typescript
1
2
3
4
5
6
7
8
const techStack = {
  framework: "Next.js 14",
  ui: "shadcn/ui",
  styling: "Tailwind CSS",
  content: "MDX",
  deployment: "GitHub Pages",
  language: "TypeScript"
}

구현 과정

1. Next.js 프로젝트 설정

먼저 Next.js 프로젝트를 생성하고 정적 내보내기를 위한 설정을 추가했습니다:

javascript
1
2
3
4
5
6
7
8
// next.config.js
module.exports = {
  output: 'export',
  basePath: process.env.NODE_ENV === 'production' ? '/repo-name' : '',
  images: {
    unoptimized: true,
  },
}

2. shadcn/ui 설정

shadcn/ui는 Radix UI와 Tailwind CSS를 기반으로 한 컴포넌트 라이브러리입니다. 필요한 컴포넌트만 복사해서 사용할 수 있어 번들 크기를 최적화할 수 있습니다.

3. MDX 통합

next-mdx-remote를 사용하여 MDX 파일을 처리하고, gray-matter로 frontmatter를 파싱합니다:

typescript
1
2
3
4
5
6
7
8
9
10
11
12
13
export async function getPostBySlug(slug: string) {
  const fileContents = fs.readFileSync(fullPath, 'utf8')
  const { data, content } = matter(fileContents)
  
  const mdxSource = await serialize(content, {
    mdxOptions: {
      remarkPlugins: [remarkGfm],
      rehypePlugins: [rehypeSlug, rehypeCodeTitles, rehypePrism],
    },
  })
  
  return { slug, content: mdxSource, ...data }
}

결론

Next.js와 shadcn/ui를 사용하여 GitHub Pages에 블로그를 구축하는 것은 비용 효율적이면서도 강력한 선택입니다. 정적 사이트의 장점인 빠른 로딩 속도와 SEO 최적화를 누리면서도, React의 유연성을 활용할 수 있습니다.

이 블로그의 소스 코드는 GitHub에서 확인하실 수 있습니다!

댓글