yamoo9 / likelion-FEQA

질문/답변 — 프론트엔드 스쿨, 멋사
29 stars 9 forks source link

[LAB-4] svg를 사용하는데 있어서 발생한 스토리북 에러에 대해서 질문있습니다 #200

Closed SeoMiYoung closed 1 year ago

SeoMiYoung commented 1 year ago

질문 작성자

서미영

문제 상황

안녕하세요. 저는 현재 마켓칼리중에서 상품문의 파트에 대해 구현하고 있습니다.

대충 틀을 만들고, 스토리북을 통해(명령어: npm run storybook)서 확인해보았더니, image 위와 같이, ProductInquiry부분을 확인하라는 에러가 떴습니다.

npm start를 통해서 확인했을때는 image 위와 같이 에러가 뜨지 않고, 문제없이 화면에 보여집니다.

그래서 어떤 문제때문에 스토리북에서 저런 에러가 발생했는지 궁금해서 여러번 주석을 쓰고 지우면서 확인해보니 ProductInquiry.jsx에서 Lock을 사용했는데, image 위의 사진에서 Lock 을 사용한 81번째 줄을 주석처리하면 스토리북에서 문제없이 잘 돌아가는것을 확인할 수 있었습니다.

리액트에서 svg를 사용하기 위해서 저는 ProductInquiry.jsx에서 코드 상단부분에 import { ReactComponent as Lock } from '@/assets/product-detail/ic-lock.svg'; 이렇게 import시켜서 사용하고 있는데요,

Lock을 뭔가 잘못사용했기 때문에 스토리북에서 에러가 난건 알겠는데, 원인과, 왜 npm start를 하면 화면에 문제없이 보여지는데, 스토리북을 통해 보면 에러가 발생한건지 궁금합니다.

답변해주시면 감사하겠습니다.

프로젝트 저장소 URL

https://github.com/SeoMiYoung/project-repo 브랜치 정보: feat/#96

환경 정보

운영체제 정보: 윈도우 Node.js 정보: v18.14.0

yamoo9 commented 1 year ago

문제 원인

@SeoMiYoung 님. React 앱(with Webpack)에 설정된 SVGR 로더 설정이 Storybook 앱에는 설정되어 있지 않기 때문입니다. 😥

문제 해결

Storybook main.ts 구성 파일에 SVGR 사용을 위한 Webpack 구성을 확장해야 합니다. 그러면 Storybook에서도 SVGR을 사용할 수 있습니다. 오늘 이슈가 상당히 많이 올라와서 직접 테스트는 못해봤습니다. 팀 내에서 Webpack 구성한 팀원과 논의한 후 반영해보세요. 😃

import * as path from 'path';

export default {
  webpackFinal: async (config, { configType }) => {
    config.module.rules.push({
      test: /\.svg$/i,
      oneOf: [
        {
          dependency: { not: ['url'] },
          use: [
            {
              loader: '@svgr/webpack',
              options: {
                titleProp: true,
                svgo: true,
              },
            },
            'new-url-loader',
          ],
        },
        {
          type: 'asset/resource',
          generator: {
            filename: 'static/[name].[contenthash][ext][query]',
          },
          parser: {
            dataUrlCondition: 4 * 1024,
          },
        },
      ],
    });

    return config;
  },
};
SeoMiYoung commented 1 year ago

야무쌤 답변 정말 감사합니다. 위의 문제와 관련해서는 팀원들과 상의해보도록 하겠습니다!

근데 추가로 궁금한점이, 혹시 리액트에서는 꼭 svg파일을 import시켜야만 사용할 수 있나요..?

왜인지는 모르겠는데, 그냥 src경로를 통해서 이미지 파일을 불러왔을 때 이미지가 안불러와지는 경우가 있더라고요, 그래서 이미지를 import { ReactComponent as Lock } from '@/assets/product-detail/ic-lock.svg'; 이런식으로 모두 import시켜서 가져왔더니 이미지가 제대로 화면에 불러와져서 계속 그 방법을 쓰고 있습니다.

그래서 저는 "아~ import를 시켜서 사용해야되나보다~"라고 생각하면서 지금까지 쓰고 있는데 혹시 제가 잘못 생각하고 있는건가요?

yamoo9 commented 1 year ago

야무쌤 답변 정말 감사합니다. 위의 문제와 관련해서는 팀원들과 상의해보도록 하겠습니다!

근데 추가로 궁금한점이, 혹시 리액트에서는 꼭 svg파일을 import시켜야만 사용할 수 있나요..?

왜인지는 모르겠는데, 그냥 src경로를 통해서 이미지 파일을 불러왔을 때 이미지가 안불러와지는 경우가 있더라고요, 그래서 이미지를 import { ReactComponent as Lock } from '@/assets/product-detail/ic-lock.svg'; 이런식으로 모두 import시켜서 가져왔더니 이미지가 제대로 화면에 불러와져서 계속 그 방법을 쓰고 있습니다.

그래서 저는 "아~ import를 시켜서 사용해야되나보다~"라고 생각하면서 지금까지 쓰고 있는데 혹시 제가 잘못 생각하고 있는건가요?

@SeoMiYoung님. 😊 유사한 질문에 대한 답변 글( https://github.com/yamoo9/likelion-FEQA/issues/142#issuecomment-1468721802 )을 참고해주세요.

SeoMiYoung commented 1 year ago

와..야무쌤 정말 정말 정말 답변 감사합시다!!