`프론트엔드 개발자` 개형이의 벽돌집

[Storybook] 스토리북 환경에서 svg 파일 사용하기 (feat. svgr) 본문

Next.js

[Storybook] 스토리북 환경에서 svg 파일 사용하기 (feat. svgr)

개형이 2024. 2. 14. 15:34

 

사이드 프로젝트 진행 중에 아이콘컴포넌트가 필요하여 제작했다.

 

제작한 이후 스토리북에서 확인할 수 있게 추가했는데

 

svg파일로 된 아이콘을 불러오지 못했다.

 

 

 

Error: Can't resolve '@/assets/icons/bookmark-outline.svg' in '내프로젝트경로'

위와 같이 에러가 발생했다.

 

스토리북에서 사용하는 webpack에 문제가 있는 것 같아서 확인해 본 결과,

 

" 스토리북에서 webpack에 file loader 기본 속성으로 svg 파일을 변환하려고 함 "

 

svg 파일 변환을 현재 내 프로젝트 환경에서 사용하고 있는 svgr을 사용하여 변환하도록 코드를 추가해 줬다.

 

 

코드 추가는 .storybook/main.ts 에서 진행한다.

 

// ...
webpackFinal: (config: any) => {
    const imageRule = config.module.rules.find((rule) => {
      const test = (rule as { test: RegExp }).test

      if (!test) {
        return false
      }

      return test.test('.svg')
    }) as { [key: string]: any }

    imageRule.exclude = /\.svg$/

    config.module.rules.push({
      test: /\.svg$/,
      use: ['@svgr/webpack'],
    })

    return config
  },
  // ...

 

 

svg파일 변환에 대한 기본 설정을 제외하고 svgr 사용으로 추가하는 로직이다.

 

위 코드를 추가하면 당연히 잘 될 줄 알았지만...

에러가 그대로 발생했다. 😇

 


 

 

이슈의 문제는 경로에 있었다.

 

아이콘 컴포넌트 스토리북에서 svg import를 다음과 같은 경로로 적용했었다.

 

import BookmarkOutlineIcon from '@/assets/icons/bookmark-outline.svg'

 

 

절대경로를 사용한 문제가 이슈일 거라고 미처 생각하지 못하고...

 

웹팩 조건만 이것저것 바꾼 시간이 너무 아까웠다.

 

경로를 상대경로로 바꿨더니 정상적으로 스토리북에 svg 아이콘이 보였다.

 

import BookmarkOutlineIcon from '../../assets/icons/bookmark-outline.svg'

 

 

물론 절대경로를 사용할 수 있는 설정도 있는 듯하다. 우선은 난 상대경로를 사용했다.

 

 


 

 

경로만의 문제라 생각하고 웹팩 적용 옵션을 제거해 봤는데 에러 발생한다.

 

 

 

Element type is invalid: expected a string (for built-in components) or a class/function (for composite components) but got: object.

 

위 에러가 발생할 수 있으니

 

svgr 웹팩 옵션을 스토리북 main.ts에 추가하는 것도 잊지 말자.

 

 


 

 

개발하며 환경에 대한 이슈가 발생하면

시간이 많이 소요되는 점이 안타깝다.

 

발생한 문제 자체에 대한 원인에 집중하는 개발자가 되어보자 나 자신.

Comments