다크 모드 - Next.js
다크 모드 - Next.js
Next.js 앱에 다크 모드를 추가하는 방법을 단계별로 알려드릴게요. 여기서는 테마 상태를 서버와 클라이언트가 공유할 수 있게 도와주는 next-themes 라이브러리를 사용해요. 이렇게 하면 SSR 환경에서도 초기 렌더링 시점의 테마를 안전하게 결정할 수 있어요.
출처: 문서
본문
Next.js에서 다크 모드를 설정하는 흐름을 따라가 볼게요.
next-themes 설치하기
먼저 next-themes를 설치해요.
npm install next-themes
테마 프로바이더 만들기
next-themes의 ThemeProvider를 그대로 감싸는 커스텀 프로바이더를 만들어요. 이렇게 한 번 감싸두면 나중에 기본 설정을 추가하거나 로직을 확장하기 편리해요.
"use client"
import * as React from "react"
import { ThemeProvider as NextThemesProvider } from "next-themes"
export function ThemeProvider({
children,
...props
}: React.ComponentProps<typeof NextThemesProvider>) {
return <NextThemesProvider {...props}>{children}</NextThemesProvider>
}
루트 레이아웃 감싸기
만든 ThemeProvider를 루트 레이아웃에 추가해요. defaultTheme="system"과 enableSystem을 지정하면 사용자 시스템의 다크 모드 설정을 기본값으로 따르게 돼요. suppressHydrationWarning은 서버와 클라이언트가 그리는 html 속성이 다를 때 생기는 경고를 억제하는 역할을 해요.
import { ThemeProvider } from "@/components/theme-provider"
export default function RootLayout({ children }: RootLayoutProps) {
return (
<>
<html lang="en" suppressHydrationWarning>
<head />
<body>
<ThemeProvider
attribute="class"
defaultTheme="system"
enableSystem
disableTransitionOnChange
>
{children}
</ThemeProvider>
</body>
</html>
</>
)
}
모드 토글 추가하기
이제 사이트에 모드 토글을 배치해서 라이트 모드와 다크 모드를 오갈 수 있게 해요.