Vite 환경에서 임베디드 배포를 위한 Vite 번들 구조 단순화하기
여러 파일 경로를 관리해야 하던 Vite 빌드 결과물을 단순화해, 외부 페이지 임베디드 경험을 개선한 과정을 소개합니다.
오또니
2026년 3월 26일

개요
진행 중인 프로젝트에서 외부 라이브러리를 사용하고 있었고, 해당 라이브러리는 WASM 파일에 의존하고 있었다. 문제는 이 WASM 파일의 용량이 30MB를 넘어서면서 네트워크 리소스를 크게 사용한다는 점이었다. 그래서 다른 네트워크 사용량도 함께 줄일 수 있는지 분석이 필요하다고 판단했다.
분석을 진행해보니, 빌드된 프로젝트의 index.html이 멀티 청크 구조로 분리되어 있었고 그만큼 네트워크 요청도 여 러 번 발생하고 있었다. 이 부분을 개선하면 초기 로드 속도도 함께 나아질 수 있겠다고 판단했다.
또 하나의 불만은 배포된 결과물을 다른 페이지에 임베디드할 때 사용자가 알아야 하는 파일 수가 너무 많다는 점이었다. 사용자는 가능한 한 1~2개의 파일만으로 제품을 페이지에 붙이고 싶어 하는데, 여러 파일을 관리하게 되면 실수가 발생할 가능성이 높다. 이 문제 역시 개선이 필요했다.
분석
현재 프로젝트는 TypeScript와 Vite 기반으로 구성되어 있다. 그런데 Vite 환경으로 빌드한 결과물의 index.html은 단일 번들이 아니라 여러 청크를 import하는 구조였다. 이 때문에 사용자가 크로스 뷰어를 다른 페이지에서 가져다 쓰기 번거로운 상황이었다.
원인은 manualChunks 설정으로 mobile, utils, vendor 청크를 나누고 있었고, publicApi 엔트리도 별도로 관리하고 있었기 때문이다. 그 결과 총 4~5개의 파일이 생성되고 있었다.
개선 방향
Vite 설정을 아래와 같이 수정하면 여러 청크를 생성하지 않고 하나의 번들 중심으로 관리할 수 있다.
manualChunks제거 청크 분리를 해제한다.cssCodeSplit: falseCSS도 단일 결과물로 관리한다.- 엔트리 포인트 통합 엔트리를 하나로 모아 출력 파일 수를 줄인다.
이렇게 하면 결과적으로 main-[hash].js와 style-[hash].css 정도만 남게 된다.
하지만 CSS 용량이 크지 않았기 때문에, 최종 목표는 사용자가 하나의 script만 import하면 되도록 만드는 것이었다. 따라서 CSS를 별도 파일로 남기지 않고 JS 내부에 인라인하는 추가 처리가 필요했다.
