rehype-pretty-code 는 shiki 구문 강조 도구를 활용한 Rehype 플러그인으로, Markdown이나 MDX의 코드 블록 하이라이팅을 제공합니다. 이는 빌드 시 서버에서 코드 블록을 미리 하이라이팅하기 때문에, 런타임 구문 강조를 피하면서 클라이언트 성능을 최적화할 수 있습니다. 또한, 동적 하이라이팅이 필요한 경우 클라이언트에서도 동작하도록 구성할 수 있습니다. 따라서 빌드 시 구문 강조와 클라이언트 동적 처리가 모두 가능해, 정적 사이트 생성(SSG)과 서버 사이드 렌더링(SSR) 환경 모두에서 유용합니다.
적용 방법은 간단합니다. 이전 포스팅에서 구현된 MDXRemote 컴포넌트에 설치한 rehype-pretty-code 플러그인을 import 하고 컴포넌트의 rehypePlugins props 에 Array 형태로 첫 번째 요소에 주입합니다. (두 번째 요소에 있는 Options 타입의 데이터는 rehype-pretty-code 에서 제공하는 옵션 객체입니다)
함께 주입하는 Options 데이터에 대한 부연 설명으론 지원하는 속성 및 타입은 다음과 같습니다.
여기서 사용된 theme 속성의 경우 단일 Theme 로 설정할 수도 있고, Record<string, Theme> 형태로도 설정이 가능합니다.
지원하는 Theme 을 직접 타입정의 파일에 접근해서 살펴봐도 좋고, 여기서 는 적용 가능한 Theme 를 미리 확인해 볼 수 있으니 참고하면 됩니다.
✅ 디테일한 코드 블록 스타일 적용
위 작업까지 완료하면 우리가 원하는 theme 에 해당하는 스타일이 적용된 채로 보였으면 하겠지만 실제로는 다음과 같이 아주 기본 설정만 된 채로 렌더링됩니다.
보다시피 설정한 theme 에 맞는 코드 블록의 컬러도 없고, 폰트 사이즈도 작으며 코드 블록의 간격도 마음에 들지 않습니다.
이런 스타일을 수정하기 위해서는 css 코드를 추가할 것이 있는데요, 그전에 위 작업물이 HTML 상에서 어떻게 표현되는지 확인해보겠습니다.
확인해보면 mdx 에서는 코드 블록으로 표현했던 것이 rehype-pretty-code 플러그인 덕분에 렌더링된 HTML 상에서는 코드 블록 컨테이터인 figure 태그와 data-rehype-pretty-code-figure 와 같은 data-* 속성 이 적용됩니다. figure 태그의 하위 요소들에도 태그 및 속성들이 적용 되어있는 것을 확인할 수 있습니다. 우리는 이것들을 활용해서 CSS 코드를 추가할 것입니다. 코드는 다음과 같습니다. 제가 적용한 기준으로 간단하게나마 주석을 추가했습니다.
코드에서 우선으로 확인해 볼 부분은 line 18-21 / line 37-40 입니다.
이 부분은 코드 블록에서 각 코드 조각에 대해 적용한 theme 의 해당하는 shiki 컬러값이 담긴 custom properties 가 적용되도록 하는 부분입니다.
저는 다크모드에 필요한 속성을 구분하기 위해 :root 와 .dark 클래스에 분리했었습니다.
이 부분에 각각 --shiki--light, --shiki--dark 라는 컬러값이 테마모드에 맞게 적용될 것입니다.
나머지 스타일도 같은 맥락으로 CSS Selector 를 통해 접근해서 배경색, 코드 블록의 간격, 테두리 등 원하는 스타일을 적용하면서 입맛에 맞게 수정하면 됩니다. 저는 결과적으로 현재 보고 있는 코드 블록과 같이 보이도록 스타일을 적용했습니다.
이렇게 작성된 CSS 파일을 root 의 layout.tsx 에서 import 해놓았습니다. 이 작업까지 진행했다면 다음과 같은 전후 결과를 확인할 수 있을 것입니다.
As-is
To-be
✅ 코드 블럭 유용한 문법
여기서부턴 필수적으로 적용할 사항들은 아닙니다. 하지만 아래에서 소개하는 방법들을 추가하면 좀 더 완성도 있는 코드 블록 사용이 가능하다고 생각합니다.
1. title
코드 블록의 제목을 넣을 수 있습니다.
2. caption
코드 블록의 부연 설명을 넣을 수 있습니다.
3. showLineNumbers 또는 showLineNumbers{n}
코드 블록의 각 라인을 표기할 수 있습니다
4. {n} 또는 {n-m}
코드 블록에서 특정 line 을 강조할 수 있습니다.
5. word highlight
코드 블록에서 특정 단어 단위로 강조할 수 있습니다.
👋 마무리하며
이번 글에서는 블로그 본문에서 Code-Block 영역의 스타일을 커스터마이징했던 과정을 다뤘습니다. 요약하자면 다음과 같습니다.
MDX 의 Rehype 플러그인 중 Rehype-Pretty-Code 을 활용해서 원하는 theme 를 적용
디테일한 스타일을 위해 CSS Selector 활용해서 CSS 코드를 추가
추가로 코드 블록에서 빈번하게 활용할 수 있는 문법들을 몇 가지 소개했습니다.
원래는 현재 코드 블록마다 우측 상단에 존재하는 코드 블록 복사 기능을 추가한 과정도 담으려 했으나 길어져서 이 과정은 다른 포스팅에서 소개해 보겠습니다.