Next.js 다크 모드 구현 (feat. data attribute)


이전에는…

이전에 Next.js 환경에서 다크모드를 styled component 의 공식문서에서 제공하는 방식으로 진행을 했는데 새로 고침시 다크 모드임에도 흰색 배경이 잠깐 보였다가 다크모드가 적용 되는 이슈가 발생하였다.
 
그래서 data attribute 와 css 의 변수를 통해서 리팩토링 해보려고 한다.

과정

먼저 제일 핵심이 되는 useTheme() custom hook 을 변경해준다.
이전 포스팅에서 작성하였던 기존의 useTheme() 에서 테마를 변경하는 함수인 changeTheme() 에 html 태그에 데이터 속성 data-theme 를 추가해주는 코드를 추가해주었다.
 
그 다음 them 의 초기값을 설정해주기 위해 _document.tsx 에 코드를 추가해준다.
next/script 의 Script 태그를 import 한 뒤, 테마를 초기화 시켜주는 자바스크립트 코드를 dangerouslySetInnerHTML 를 통해 적용해주고 페이지가 표시되기 전에 테마를 초기화 해주기 위해 strategy 값을 beforeInteractive 로 적용해주었다.
 
그리고 css 의 속성 선택자를 통해 useTheme() 에서 설정한 data-theme 의 값에 따라 사용할 변수를 설정해준다.
 
스타일을 사용하는 css 또는 scss 코드에 색상 변수를 지정시켜준다.
 
styled-components 공식문서에 있는 ThemeProvider 를 사용하는것이 당연한 방법이라고 생각했는데 다른 방법으로 진행해보니 공식 문서보다 더 나은 방법이 있으면 그 방법으로도 적용해보는 것도 좋은 경험이 될 것 같다는 생각이 들었다.
 

 
참고