티스토리 뷰
React 기반의 프로젝트에서는 .svg 에서 이미지를 import해서 바로 컴포넌트의 형태로 사용할 수 있지만 React 기반의 프레임워크인 NEXTjs 어플리케이션에서는 위의 방식대로 svg를 사용할 수 없습니다. svg 파일을 컴포넌트의 형태로 사용하면 svg의 속성들을 동적으로 변경해주어야 할 때 손쉽게 props를 내려줄 수 있어 편리합니다.
React에서 사용하던 것처럼 nextjs에서 svg 파일을 컴포넌트처럼 바로 사용하기 위한 몇 가지 방법을 소개합니다.
1️⃣ @svgr/webpack
1. @svgr/webpack 라이브러리 설치
yarn add --dev @svgr/webpack
npm install @svgr/webpack -D
2. next.config.js 설정
파일의 포맷이 svg인지 확인하여 svg일 경우에만 @svgr/webpack 라이브러리를 사용하도록 룰을 설정하기 위해 아래의 코드를 next.config.js에 추가합니다.
2️⃣ babel plugin
webpack을 설정하고 싶지 않다면 babel plugin을 사용하는 방법도 있습니다.
1. babel-plugin-inline-react-svg 설치
yarn add --dev babel-plugin-inline-react-svg
npm install babel-plugin-inline-react-svg -D
2. .babelrc 수정
.babelrc 파일이 없다면 프로젝트의 루트 레벨에 .babelrc 파일을 추가합니다.
.babelrc는 아래와 같이 presets와 plugins 두 개의 키를 가지고 있도록 설정하고, presets는 next/babel을, plugins에는 inline-react-svg를 추가합니다.
위의 두 방법 중 선호하는 방식으로 .svg에서 바로 파일을 import하여 ReactComponent처럼 사용할 수 있습니다.
3️⃣ .tsx 로 컴포넌트화
다소 귀찮지만 tsx 확장자로 컴포넌트 자체를 만들어 버리는 방법도 있습니다.
아이콘의 크기 및 컬러 관련한 속성들을 동적으로 변경해 줄 수 있도록 props를 설정해줍니다.
아이콘 컴포넌트를 import 하는 방식은 다른 컴포넌트를 import하는 방식과 동일합니다.
4️⃣ 스토리북에서 사용할 때
nextjs 환경에서 스토리북으로 .svg 파일의 아이콘의 UI 테스트를 진행하고 싶은 경우에는 .storybook > main.js에서 babel 또는 webpack 설정을 추가해주면 됩니다. (.tsx로 컴포넌트화 하여 사용하고 있는 경우에는 필요 없습니다.)
main.js
정리
• 아이콘을 컴포넌트의 형태로 사용하고 싶다면
• @svgr/webpack
• babel-plugin-inline-react-svg
• .tsx로 컴포넌트화
• 컴포넌트로 사용할 필요가 없다면
• <svg> 태그로 바로 삽입
• <Image> 컴포넌트의 src에 .svg의 경로 설정
'React' 카테고리의 다른 글
[react-query] useQuery와 Promise.all을 활용한 리렌더링 최적화 (1) | 2022.07.13 |
---|---|
[React] React v18 - 빠르게 둘러보기 (1) | 2022.06.09 |
[NEXTjs] 다국어 페이지 설정하기 (next-i18next) (0) | 2022.05.06 |
[NEXT.js] next.js의 Image 컴포넌트, 왜 사용할까? (2) | 2022.04.13 |
[redux-toolkit] createAsyncThunk 콜백 파라미터에 2개 이상 인자 넘기기 (0) | 2022.03.31 |