Post

expo에서 svg를 사용하는법

개요

Expo의 프로젝트를 진행중에 SVG를 사용해서 ICON를 관리를 할 필요가 생겼고

1
<Image source={require("경로")}>

이와 같이 svg를 불러와도 불러와지지 않다는것을 발견했고 SVG는 따로 패키지들을 설치해줄 필요가 있다는걸 알았습니다.


패키지 설치

expo에서 SVG를 사용하기 위해서는 첫번째로 react-native-svg라는 패키지가 필요합니다.

react-native-svg패키지는 React-Native에서 Svg의 태그를 사용할 수있게 해줍니다.

1
2
3
4
5
6
7
8
9
10
import Svg, { Circle, Rect } from 'react-native-svg';

export default function SvgComponent(props) {
  return (
    <Svg height="50%" width="50%" viewBox="0 0 100 100" {...props}>
      <Circle cx="50" cy="50" r="45" stroke="blue" strokeWidth="2.5" fill="green" />
      <Rect x="15" y="15" width="70" height="70" stroke="red" strokeWidth="2" fill="yellow" />
    </Svg>
  );
}

두번째로는 react-native-svg-transformer라는 패키지가 필요합니다.

react-native-svg-transformer패키지는 SVG파일을 React와 호환할 수 있도록 컴포넌트화 시켜줍니다.

react-native-svg-transformer를 사용하기 위해서는 metro.config.js를 수정해줘야 합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
const { getDefaultConfig } = require("expo/metro-config");

module.exports = (() => {
  const config = getDefaultConfig(__dirname);

  const { transformer, resolver } = config;

  config.transformer = {
    ...transformer,
    babelTransformerPath: require.resolve("react-native-svg-transformer/expo")
  };
  config.resolver = {
    ...resolver,
    assetExts: resolver.assetExts.filter((ext) => ext !== "svg"),
    sourceExts: [...resolver.sourceExts, "svg"]
  };

  return config;
})();

이 방식은 Expo SDK v41.0.0 이후 버전 에서 적용하는 방식이며

다른 방식은 여기서 참고해주세요

모든 설치가 완료 되었다면

1
2
3
import Logo from './assets/logo.svg';

<Logo width={120} height={40} />;

이런식으로 SVG를 import해서 사용할 수 있게 됩니다.


참고

https://github.com/software-mansion/react-native-svg https://github.com/kristerkari/react-native-svg-transformer

This post is licensed under CC BY 4.0 by the author.