프로젝트 환경 : turborepo (monorepo) + vite + typescript + storybook
import Check from "../../../assets/check.svg";
...
<img src={check} alt="체크" width={14} height={14} />
이렇게 src 로 불러와서 사용할 수 있지만 이 경우 정적 이미지로 사용하는 것이기때문에 색상이나 stroke-width와 같은 속성에 접근할 수 없다
그래서 svgr 을 사용해 컴포넌트화 하여 사용하는 것이 재사용성 측면에서도 좋다
나는 vite 를 사용한 리액트 프로젝트여서 아래와 같이 패키지를 설치했다
pnpm add vite-plugin-svgr --save-dev
모노레포여서 packages/ui, apps/storybook 각각 설치해주었다.
아래 이어지는 내용도 apps/storybook 하위 경로에서 설정해주었다.
이어서 vite.config.ts 에 관련 설정을 추가한다.
import svgr from "vite-plugin-svgr";
export default defineConfig({
plugins: [react(), svgr()],
});
img 태그 대신 컴포넌트로 변경하여 적용
import Check from "../../../assets/check.svg";
...
<Check />
그러면 짜잔
스토리북에서 에러가 난다
svgr add on같은 문제가 아닐까 싶었다
아래와 같이 추가로 설정 해주고 해결
main.ts
import svgr from "vite-plugin-svgr";
...
async viteFinal(config) {
config.plugins = [
...(config.plugins || []),
svgr({
svgrOptions: { icon: true },
include: "**/*.svg",
}),
];
...
svg.d.ts
declare module "*.svg" {
const content: React.FC<React.SVGProps<SVGAElement>>;
export default content;
}
vite-env.d.ts
/// <reference types="vite-plugin-svgr/client" />
/// <reference types="vite/client" />
tsconfig.json
{
"compilerOptions": {
"types": ["vite-plugin-svgr/client"] // 추가
},
"include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", "svg.d.ts"], // svg.d.ts 추가
}
packages/ui 에서 vite.config.ts
import svgr from "vite-plugin-svgr";
...
plugins: [
svgr({
include: "**/*.svg",
exclude: "",
}),
...]
블로그 이곳 저곳 찾아가며 작성했다..
이 중에 불필요한 config 가 있다면 알려주시길 부탁드립니다
'개발개발 > Date-project' 카테고리의 다른 글
모노레포 vite build 결과물이 이상해요? (0) | 2025.04.08 |
---|---|
[react-range-slider] 양방향 input range 라이브러리 적용하기 (0) | 2025.04.07 |
[스토리북] ColorPalette 컬러 팔레트 만들기 (0) | 2025.03.13 |
[vanilla-extract] Sprinkles 로 스타일 토큰 만들기 (0) | 2025.03.13 |
[스토리북] autodocs 개별 스토리에서 해제하기 (0) | 2025.03.13 |