Vite를 4에서 8로 올렸더니 빌드 번들러가 통째로 Rust로 바뀌어 있었다
Rolldown은 왜 빠른가 — 번들러 두 개를 Rust 하나로
#Vite #Rolldown #빌드 #프론트엔드 #Rust
블로그 프론트가 한참 Vite 4에 멈춰 있었다. 잘 돌아가니까 굳이 안 건드렸는데, 어느새 Vite 8까지 나와 있었다. 메이저를 네 칸이나 건너뛰는 거라 큰맘 먹고 올렸는데 — 올리고 보니 빌드 도구 속이 통째로 Rust 로 갈려 있었다. 이 글에선 Vite 8이 뭘 바꿨는지, 그리고 빌드가 왜 갑자기 몇 배씩 빨라졌는지를 정리해본다. 원래 Vite는 번들러를 두 개 썼다 이게 핵심이라 짚고 가야 한다. Vite는 처음부터 번들러를 두 개 썼다. 개발할 땐 esbuild , 프로덕션 빌드할 땐 Rollup . 왜 굳이 둘로 나눴냐면, 둘이 잘하는 게 달랐기 때문이다. esbuild는 Go로 짜여서 미친 듯이 빠르다. 그래서 개발 서버 띄울 때 의존성 변환에 썼다. 근데 청크를 어떻게 쪼갤지, 출력물을 어떻게 다듬을지 같은 세밀한 제어가 약했다. 반대로 Rollup은 그 출력 제어가 훌륭한데 느렸다. 그래서 개발=esbuild(속도), 빌드=Rollup(제어) 로 나눠 쓴 거다. 근데 번들러가 둘이면 문제가 생긴다 번들러가 두 개라는 건 플러그인 시스템도 두 개, 동작 방식도 미묘하게 둘 이라는 뜻이다. 개발 서버에선 멀쩡하던 게 막상 build하면 깨지는 일이 여기서 나온다. 둘 사이의 미세한 차이를 메우려고 글루 코드가 계속 붙고, 엣지 케이스가 쌓인다. "dev에선 되는데 빌드하면 안 돼"가 왜 그렇게 잡기 힘들었냐면, 애초에 두 개의 다른 도구가 같은 코드를 다르게 처리하고 있었기 때문이다. Vite 8 — Rolldown 하나로 합쳤다 Vite 8은 이 둘을 Rolldown 하나로 통합했다. Rolldown은 Rust로 새로 짠 번들러인데, Rollup의 플러그인 API를 그대로 호환한다. 그래서 개발이든 빌드든 같은 번들러 가 처리한다. dev/prod가 다르게 동작할 여지 자체가 사라진 거다. Vite 2 이후 제일 큰 구조 변경이라고들 하는데, 써보니 과장이 아니었다. 그래서 왜 빨라졌나 — 퍼센트가 아니라 배수다 제일 궁금했던 게 이거다. 빨라진 이유는 한두 개가 아니라 겹쳐 있다. 1. Rust 네이티브로 돈다 — 자바스크립트는 단일 스레드에 GC(가비지 컬렉션) 멈춤이 있다. Rust는 GC가 없고, 진짜 멀티 스레드 병렬이 된다. 번들링은 파일 수천 개를 동시에 주무르는 작업이라, 병렬이 되느냐 마느냐가 결정적이다. 2. 파이프라인 전체가 한 언어(Rust)로 돈다 — 파싱 → 의존성 그래프 만들기 → 최적화 → 코드 생성까지 전 단계가 Rust 안에서 끝난다. 중간에 자바스크립트랑 데이터를 주고받느라 멈추는 구간이 없다. 3. 밑바닥에 Oxc가 깔린다 — Rolldown 아래엔 Oxc라는 Rust 파서가 있다. 이게 얼마나 빠르냐면 코드 포매팅에서 Prettier의 30배 수준이다. 파싱부터가 다른 차원이다. 그래서 개선폭이 10~30%가 아니라 10~30배 로 나온다. 실제로 Linear라는 회사는 빌드가 46초에서 6초로 줄었다고 한다. 언어를 바꾸면 개선이 퍼센트가 아니라 배수로 찍힌다. 올리면서 막힌 점 메이저 네 칸 점프라 공짜는 아니었다. 바뀐 설정 옵션 몇 개를 손봐야 했고, Node 버전도 최신으로 올려야 했다. 다만 Rolldown이 Rollup 플러그인 API를 호환해줘서, 쓰던 플러그인 대부분은 그대로 붙었다. 걱정한 것보단 수월했다. 한 가지, Vite + Rolldown + Oxc가 이제 한 팀처럼 같이 움직인다. 파싱(Oxc) → 번들(Rolldown) → 빌드(Vite)가 같은 진영 도구라, 단계 사이에서 동작이 어긋날 일이 줄었다. 정리하면 나는 그동안 "프론트 빌드가 느린 건 원래 그런 것"이라고 체념하고 있었다. 근데 Vite 8을 써보고 생각이 바뀌었다. 느렸던 건 도구의 한계가 아니라 언어의 한계 였다. 자바스크립트로 짠 도구가 자바스크립트를 번들링하니 느릴 수밖에 없었고, 그 밑을 Rust로 바꾸니 차원이 달라졌다. 혹시 아직 Vite 4~5에 멈춰 있다면, 8로 올려보는 걸 권한다. 메이저 점프라 약간의 각오는 필요하지만, build 명령 한 번 돌려보고 시간을 재보면 왜 다들 난리인지 바로 체감된다.