Webpack에서 Vite까지: 프론트엔드 빌드 툴의 진화
프론트엔드 개발은 빠르게 진화한다. 과거에는 단순한 HTML, CSS, JavaScript 파일만으로 충분했지만, 이제는 수백 개의 모듈과 프레임워크, 그리고 최신 문법을 사용하는 복잡한 애플리케이션으로 발전했다.
이 변화 속에서 빌드 툴은 “코드를 실행 가능한 형태로 변환하고, 더 빠르게 피드백을 주는 것”을 목표로 발전해왔다.
1. Webpack의 등장 — 모든 리소스를 번들링하다.
Webpack(2012)은 자바스크립트 생태계의 게임체인저였다. 당시 브라우저는 import / export(ESM)를 지원하지 않았기 때문에, 수십 개의 JS 모듈을 하나의 파일로 묶는 번들링 과정이 필수였다.
Webpack은
- 모듈 간 의존성 분석
- CSS, 이미지, 폰트까지 JS 안으로 통합
- Loader / Plugin으로 빌드 과정 확장
을 가능하게 하며, 대규모 프론트엔드 프로젝트의 시작점이 되었다.
하지만 단점도 명확했다.
- 초기 빌드와 HMR(핫 리로드)이 느리다.
- 설정 파일이 복잡하다.
- 변경된 파일만 다시 빌드하기 어렵다.
즉, 프로젝트가 커질수록 느린 개발 피드백이 문제였다.
2. 트랜스파일링의 시대 — 새로운 문법을 모든 브라우저에서
ES6(2015) 이후, 자바스크립트는 빠르게 진화했다. let, const, arrow function, class, async/await 등 새로운 문법이 쏟아졌지만, 모든 브라우저가 이를 지원하지는 않았다. 이 문제를 해결하기 위해 *트랜스파일러(Transpiler)가 등장했다.
- Babel: 최신 JS를 구버전 JS로 변환
- TypeScript Compiler (tsc): TypeScript를 일반 JS로 컴파일
이 시기부터 빌드 툴은 단순 번들러가 아니라 “코드를 변환(Transform)하는 시스템”으로 발전했다. Webpack은 Babel과 결합해 최신 문법을 안정적으로 사용할 수 있는 개발 환경을 제공했지만, 이런 복잡한 트랜스파일링 파이프라인은 빌드 속도를 더욱 느리게 만드는 원인이 되었다.
*트랜스파일링(Transpiling)
: 최신 문법으로 작성한 코드를 구버전 브라우저에서도 실행 가능한 코드로 변환하는 과정
3. Parcel, Snowpack — 속도를 위한 첫 도전
Webpack의 느린 빌드 속도에 대한 반발로, “설정이 필요 없는 빌드 툴”이 등장했다.
- Parcel (2017): “Zero Config”를 내세우며 자동 의존성 분석과 병렬 빌드를 지원
- Snowpack (2019): “ESM 기반 개발 서버”를 도입해 변경된 모듈만 즉시 갱신
이제 빌드는 모든 파일을 다시 묶는 과정이 아니라, 필요한 부분만 즉시 변환하는 과정으로 변화하기 시작했다.
4. Vite의 등장 — 번들링 이전의 사고방식
Vite(2020)는 Evan You(Vue.js 창시자)가 만든, “Webpack의 느림”을 근본적으로 해결한 빌드 툴이다. 핵심은 두 가지이다.
(1) 개발 단계: ESM 기반 Dev Server + 즉시 트랜스파일링
Vite는 ESM(ECMAScript Module) 을 기반으로 동작한다. 즉, 브라우저가 import를 직접 처리할 수 있기 때문에 CommonJS → ESM 변환 같은 ‘모듈 변환 트랜스파일링’이 필요 없다. 이 덕분에 개발 서버는 즉시 실행 가능한 속도를 확보한다. 코드가 변경되면 전체를 다시 빌드하지 않고, 변경된 모듈만 on-demand로 변환하여 반영한다.
하지만 언어 트랜스파일링(예: TypeScript, JSX, 최신 JS 문법 변환) 은 여전히 필요하다. 이를 위해 Vite는 esbuild를 사용하며, Go 언어로 작성된 esbuild는 Babel보다 훨씬 빠르게 실행된다. 즉, Vite는 “모듈 변환” 트랜스파일링은 생략하지만, “언어 수준 변환”은 초고속으로 수행하는 것이다. 이 구조가 Vite 속도의 핵심이라 할 수 있다.
(2) 배포 단계: Rollup 기반 번들링
프로덕션 환경에서는 여전히 코드 최적화와 번들링이 필요하다. Vite는 이 단계에서 Rollup을 사용하여 *트리 셰이킹(tree shaking), 코드 스플리팅(code splitting) 등 최적화된 결과물을 생성한다.
*트리 셰이킹: 사용되지 않는 코드를 제거해 번들 크기를 줄이는 최적화 기법
5. 트랜스파일링이 왜 중요한가?
트랜스파일링은 단순히 문법을 변환하는 과정이 아니라, 빌드 툴의 구조와 철학을 결정하는 핵심이다.
| 빌드 툴 | 트랜스파일링 시점 | 특징 |
| Webpack + Babel | 빌드 시 전체 코드 변환 | 느리지만 안정적 |
| Snowpack | 변경된 파일만 변환 | 부분 최적화 |
| Vite | 브라우저 요청 시 즉시 변환 | 빠른 피드백, 실시간 반응 |
Vite가 빠른 이유: 모든 코드를 미리 변환하지 않고, 필요한 순간에만 언어 트랜스파일링을 수행하며, 모듈 변환 단계는 제거한다.
6. 빌드 툴 진화 타임라인
| 세대 | 주요 툴 | 핵심 특징 | 변화 포인트 |
| 1세대 | Grunt / Gulp | 파일 복사, 압축 | 태스크 자동화 |
| 2세대 | Webpack | 번들링, Babel 통합 | 코드 관리 중심 |
| 3세대 | Parcel / Snowpack | 캐싱, 부분 빌드 | 속도 개선 |
| 4세대 | Vite | ESM + 실시간 트랜스파일링 | 개발 경험 중심 |
7. 결론
빌드 툴의 발전은 결국 “트랜스파일링 효율화의 역사”다. Webpack은 모든 코드를 미리 번들링하고 변환했지만, Vite는 필요한 시점에만 언어 트랜스파일링을 수행하며, 모듈 변환 단계는 아예 제거했다. 이 철학의 차이가 속도와 개발 경험(DX)의 격차를 만든다. 결국 빌드 툴의 진화는 단순한 기능을 추가가 아니라, 불필요한 전체 변환을 줄이고, 필요한 순간만 코드를 변환하는 효율화 과정이라 할 수 있다.