개발환경
- React 18
- Typescript 4
- Webpack 5
- styled-components
- SVGR
원래는 React에서는 SVG를 사용할 때 아래와 같은 방법을 주로 사용했다.
import { ReactComponent as Logo } from "assets/images/logo.svg";
<Logo />
그러나 Webpack5, Typescript 등 새로운 환경에서는 기존 방법이 잘 작동하지 않아 SVGR 라이브러리를 설치하여 사용하고 있다. 그러면서 아래와 같은 문법을 주로 사용하여 SVG를 호출하고 있었다.
import CancelSvg from "assets/images/cancel.svg";
<Cancel />
위와 같은 방법으로 잘 사용하고 있었으나 체트박스 컴포넌트를 만들면서 background-image에 url을 넣는 방법을 적용 중이었는데 해당 경로를 불러오지 못하여 webpack 설정을 다시 했다. 아래와 같은 설정을 적용하여 url과 컴포넌트 형식으로 사용 가능하다.
설치 및 설정
svgr/webpack 설치
npm install @svgr/webpack
https://www.npmjs.com/package/@svgr/webpack
webpack.config.js파일 수정
// webpack.config.js
module.exports = {
...
module: {
rules:[
...
{
test: /\.svg$/,
oneOf: [
{
use: ['@svgr/webpack'],
issuer: /\.[jt]sx?$/,
resourceQuery: { not: [/url/] },
},
{
type: 'asset',
resourceQuery: /url/, // *.svg?url
},
],
},
]
}
}
svg.d.ts 파일 생성
나는 declarations.d.ts 파일에 declarations 설정들을 모아놓았다.
*.svg?url 과 *.svg 2가지 declare을 추가 해준다.
// src/types/declarations.d.ts
declare module '*.svg?url' {
const content: any;
export default content;
}
declare module '*.svg' {
import React = require('react');
export const ReactComponent: React.FC<React.SVGProps<SVGSVGElement>>;
const src: string;
export default src;
}
tsconfig.json 파일 수정
tsconfig.json 파일에 위에 선언해준 해당 d.ts파일을 인식시키기 위해 include에 폴더 경로를 추가해준다.
{
...
"include": [..., "src/**/*.d.ts"],
}
SVG 사용하기
1. SVG를 url로 사용
styled-compoents의 css를 통하여 commonStyles.ts를 관리하고 있었다.
import시 svg 경로 뒤에 ?url 을 붙여야 한다.
// commonStyles.ts
import { css } from "styled-components";
import CheckSvg from "assets/images/check.svg?url";
const check = css`
background-image: url(${CheckSvg});
`;
import LogoSvg from 'assets/images/logo.svg?url';
<img src={LogoSvg} />
2. SVG를 컴포넌트로 사용
원래 svgr 라이브러리를 사용하던 방식대로 사용하면 된다.
import LogoSvg from 'assets/images/logo.svg';
<LogoSvg />
위 webpack 설정을 통해 2가지 방법으로 SVG를 사용할 수 있게 되었다.
참고자료
https://velog.io/@song961003/webpack5-tw.macro%EC%97%90%EC%84%9C-svg-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0
'React' 카테고리의 다른 글
[React-Query] 리액트 쿼리 브라우저 복귀시 API 중복 요청 방지 (0) | 2024.10.29 |
---|---|
[React] html2pdf.js를 활용해 PDF 다운로드 구현하기 (0) | 2024.07.17 |
[React] 글로벌스타일(GlobalStyle) 적용 with Styled-Components (0) | 2024.06.25 |
[React] SVG 파일 index.ts에서 export 하기 - SVGR (0) | 2024.05.22 |
[React] npm start시 port 번호 변경하는 방법 (0) | 2024.03.06 |