리액트에서 이미지를 다루는 방법

리액트에서 이미지를 다루는 방법

CRA에선 어떻게 이미지를 처리하는가?

10KB미만의 이미지 파일은 data URI의 형태로 변환되어 html에 포함된다. url-loader가 이미지 파일을 만나면 data URI 형태로 변경해주기 때문에 가능한것이다. 이렇게 하면 http 요청수를 줄일 수 있고, bmp, gif, jpg, jpeg, png에만 적용되고 svg는 제외된다. 물론 10KB라는 수치도 변경이 가능하다고 한다.

data URI란 간단히 말하면 작은 크기의 파일을 문서내에 인라인으로 포함하기 위해서 사용된다. 아이콘을 base64로 인코딩하여 data URI형태로 문서에 인라인 하는 방식을 많이 사용한다.

SVG는 왜 제외 됬는가?

이슈 내용을 살펴보면 CRA가 버전 0.8로 업데이트 되면서 url-loader를 사용하여 10KB 미만의 이미지를 data uri형태로 처리하게 변경되었는데, 그것 때문에 원래 잘 쓰고 있던 본인의 svg sprite system이 망가졌다는 이슈이다.

이 사람이 원래 쓰고 있던 svg sprite system은 이렇게 동작한다. 한 폴더에 모여있는 SVG파일들이 빌드 후 10KB미만의 SVG 스프라이트 파일(sprite.svg)로 합쳐진다. 이 스프라이트에서 fragment identifiers를 통해 일부 아이콘만 가져와서 리액트 컴포넌트로 만들어서 사용중이었다고 한다. 이렇게 svg sprite를 이용할 경우 브라우저 캐시를 이용할 수 있어서 큰 장점이 있다.

import React, { PropTypes } from 'react' import svgSprite from '../img/symbol/sprite.svg' function Icon({ name }) { return ( ) }

그런데, CRA가 10KB 미만의 svg의 fragment도 url-loader로 처리하여 base64로 인코딩되는 바람에, 아이콘을 제대로 불러오지 못하는 이슈가 발생한것이다. 그래서 SVG 스프라이트의 파일을 10KB 이상으로 잡아서 url-loader를 안거치는 방법 말고 다른 방법이 있는지가 질문 내용이다.

svg fragment란 ... 부분을 의미한다. 하나의 svg 단위라고 생각하면 된다.

어쨌든, 이런 이슈 때문에 SVG는 url-loader가 처리하지 않게끔 변경되었다고한다.

출처

https://create-react-app.dev/docs/adding-images-fonts-and-files/

from http://simsimjae.tistory.com/387 by ccl(A) rewrite - 2020-03-19 15:20:18

댓글

이 블로그의 인기 게시물

단위 테스트 환경 구축

Coupang CS Systems 채용 정보: Front-end 개발자를 찾습니다!

스토리북에서 스토리를 작성하는 방법