oris9
[React] vite로 프로젝트 생성후 이미지 배포 오류 (vite에서 정적파일 가져오기, asset, public assets 차이) 본문
[React] vite로 프로젝트 생성후 이미지 배포 오류 (vite에서 정적파일 가져오기, asset, public assets 차이)
oris9 2024. 6. 5. 18:56
- public
- /*로고 이미지 파일*/
- src
- assets
- /*.svg, .png 파일들*/
일반적인 프로젝트 디렉토리 구조이다.
Vite는 모듈 시스템을 이용하는 경우 자동으로 상대경로를 절대경로로 변환한다.
그래서 import a from "../../../assets/a.png" 와 같은 상대 경로를 사용하는 코드는 Vite로 빌드시 자동으로 절대경로로 변환된다.
하지만!!! HTML 파일의 <a> 태그에서는 이러한 자동 변환이 일어나지 않는다. 🥹
이러한 이유로 에셋을 사용할때 상대경로르 입려했지만 로고이미지 다운에서만 문제가 발행하였다.
모듈로 import 되지 않는 에셋을 사용하가 위헤서는 절대 경로를 사용하는 것이 더 안전하다!
profile
넴 이미지 파일명을 그대로 보존하고 싶으면 public폴더
그게 아니면 src폴더에 넣습니다
이때 정적파일들은 public 폴더와 src/assets폴더 두 곳에 저장할 수 있는데
public 폴더는 캐싱되고, assets폴더는 캐싱되지 않는다는 것이 가장 큰 차이이며,
두 폴더는 빌드될때 서로 다른 경로에 위치하게 된다.
public
(개발시 `/` 프로덕션시 `dist/`에 위치 )
데이터 빌드 과정에서 공개적으로 제공된다.
~URL~/image.png 와 같이 접근이 가능하다.
빌드과정에서 최적화가 되지않는다.
캐시의 영향을 받는다 = 파일명이 그대로 보존된다 = 빠른 업데이트가 어려워서 파일의 수정에 따른 처리를 해줘야한다.
따라서..
robots.txt와 같이 소스 코드에서 참조되지 않는 에셋
( ** `robots.txt` : 보안과 관련된 파일으로 검색엔진의 검색수집 제한범위를 설정할 수 있다 반드시 홈페이지 루트위치에 존재해야함.)
해싱 없이 항상 같은 이름을 갖는, 가져야하는 에셋 (파일명을 그대로 보존하고 싶을때)
또는 URL을 얻기 위해 굳이 import 할 필요 없는 에셋
들의 경우에는 public폴더에 위치시키는게 맞다고 볼 수 있다.
** 경로 작성시에는 절대경로로 작성해줘야한다. `/`기준
`<img src={ 환경변수(배포URL) + 이미지 경로 }/>` 와 같이 작성해주면 안전하게 사용가능하다.
src/assets
캐시의 영향을 받지 않는다 = 빌드시 파일 이름에 자동으로 해시가 붙고, 파일업데이트시에는 해시가 변경되는 방식 = 업데이트 👍
(이미지파일 경우는 제외로, 수정시에도 해시값이 변경되지않는다고한다!)
번들링 과정에서 모듈형태로 가져오고 최적화가 일어난다. -> 제공하기 직전에 public 폴더에 '삽입'된다.
TypeScript의 경우, 기본적으로 import로 정적 에셋 가져오기를 유효한 모듈로 인식하지 않는다 -> `vite/client`를 포함시켜 해결가능.
import imgUrl from './img.png' // import 방식으로 이미지 가져오기
imgUrl = "/img.png" // dev
imgUrl = "/assets/img.2d8efhg.png" // production (2d8efhg는 해시 값을 의미)
참고
https://ko.vitejs.dev/guide/assets.html#the-public-directory
'React' 카테고리의 다른 글
[React] Error: cannot find module error 해결 (0) | 2024.04.24 |
---|