본문 바로가기
내가 경험한 것/1.5

스토리북에서 NextJs Local 폰트와 vanilla extract 함께 사용하기

by nr2p 2024. 3. 18.
반응형

지난 번 NextJs Local 폰트를 사용 할 수 있도록 nextJs 와 storybook 에 세팅을 해놓았다.

그리고 vanilla extract globalTheme 과 함께 사용하려고 하는데 문제가 생겼다.

어떤 문제인지 원인과 해결방법을 알아보자

 


1. 무슨 문제일까?

const globalVars = createGlobalTheme(':root', {
  font: {
    pretendard: 'var(--font-pretendard)',
    hakgoansimMulgyeolB: 'var(--font-hakgoansimMulgyeolB)',
    caniculeDisplayB: 'var(--font-caniculeDisplayB)',
  },
});

 

위와 같은 환경에서 globalVars.font.hakgoansimMulgyeolB 를 사용하면 폰트가 적용이 되지 않았다.


2. 원인은!

1번의 사진만 봐도 눈치를 챘을 수 있다.

 

js 에만 스코프가 있는게 아니다ㅎㅎ

내 var 을 넣어둔 div 보다 위에 있는 :root 에서 div의 var 을 찾았으니 당연히 안되는거였다.


3. 해결

사실 스토리북에서도 variable 을 root 에 넣고 싶었는데

decorator 내부에서 <html  class=""> 이런식으로 추가해버리면 기존 스토리북 UI 도 사라져 버려서.. div 로 감싸서 넣었었다.

 

 decorators: [
    Story => {
      if (window?.document?.documentElement) {
        // next/font 오류로 인해 스토리북 환경에서는 pretendard var 대신 FontFamily 로 사용
        window.document.documentElement.classList.add(
          hakgoansimMulgyeolB.variable,
          caniculeDisplayB.variable
        );
      }

      return <Story />;
    },
  ],

 

생각해보니 jsx 로 넣을 수 없다면 직접 추가하면 되겠다는 생각이 들어

위와 같이 처리해주었다.

 

4. 해결했지만 또 다른 문제..

코드에 적힌 주석처럼 pretendard 는 문제가 있어서ㅜㅜ 

위와 같이 처리해주지 못했다.

 

pretendard.variable 을 찍어보면 다른 서체와는 다르게 스페이스바가 들어가 있다.

nextjs 에서는 괜찮은데 스토리북 쪽에서만 그랬다.

(스페이스를 없애는 등 여러가지 시도를 해보았지만 되지 않았다... )

 

그래서... 

어쩔 수 없이 preview-head.html 을 만들고

스토리북에서는 cdn 으로 폰트를 로드하는 방식을 택했다.

반응형