[지은] SVG 파일을 react component처럼 사용하기 (feat. svgr) - boostcampwm2023/web04-ALGOCEAN GitHub Wiki

개요

왜 SVG 파일을 컴포넌트처럼 사용하고자 하는가?

react에서 SVG 파일은 크게 2가지 방법으로 사용할 수 있다.

  • img 태그의 src에 svg 파일을 전달하는 방법
  • 특정 라이브러리를 활용하여 컴포넌트처럼 사용하는 방법

첫번째 방법이 간단하다는 장점이 있지만 세부적인 설정은 할 수 없다는 단점이 있다.

따라서 높이, 색상 등을 상대적으로 세세하게 컨트롤 할 수 있는 두번째 방법을 사용하기로 결정했다.

적용

1. svgr 라이브러리 채택

SVGR - Transforms SVG into React Components. - SVGR

svgr는 react에서 svg 파일을 컴포넌트처럼 사용할 수 있도록 하게 해주는 라이브러리이다.

vite에서 svgr 라이브러리를 사용하기 위해선 vite-plugin-svgr 플러그인을 설치해주면 된다. 다음과 같은 명령어를 통해 vite-plugin-svgr를 설치하도록 하자.

$ npm install --save-dev vite-plugin-svgr

2. vite.config.js

vite에게 우리가 vite-plugin-svgr 플러그인을 사용할 것이라는 것을 말해줘야 한다. vite.config.js에 다음과 같이 작성하여 플로그인을 추가해주자.

// vite.config.js
import svgr form 'vite-plugin-svgr'; // 플러그인 import

export default defineConfig({
	...,
	plugins: [..., svgr()] // ✅ svgr() 추가
});
	

3. 타입스크립트 관련 추가 설정

타입스크립트를 사용한다면 다음과 같은 설정을 추가해 주어야 한다. 잊지 말고 꼭 추가하여 타입 에러가 발생하지 않도록 하자.

vite-env.d.ts

// vite-env.d.ts
...
/// <reference types='vite-plugin-svgr/client' /> // 이 태그를 추가해준다.

svg.d.ts

svg 파일에 대한 타입을 선언. 프로젝트의 루트 디렉토리에 위치하면 된다. (이름은 자유롭게 변경 가능하다)

// svg.d.ts 
declare module '*.svg' {
  import React = require('react');
  export const ReactComponent: React.FC<React.SVGProps<SVGSVGElement>>;
  const src: string;
  export default src;
}

tsconfig.json

타입스크립트에게 svg 관련 타입 선언을 사용해줄 것을 말해주자

// tsconfig.json
{
	"compilerOptions": {
		...
	},
	"include": [..., **"svg.d.ts"**]
}

사용 예시

위와 같은 설정을 모두 마쳤다면 다음과 같이 SVG 파일을 컴포넌트처럼 사용할 수 있다.

svg를 import해 줄 땐 꼭 뒤에 ?react 접미사를 추가해주도록 하자. 그래야 올바르게 인식할 수 있다.

import SVGIcon from '../svg-icon.svg**?react**';

export default MyComponent() {
	return (
		<SvgIcon width='24px' cursor='pointer' fill='#ffffff'/>
	)
};