- 향후 Vite에 번들러로 사용하기 위해 Rust로 작성된 자바스크립트 번들러
- Rollup 호환 API와 플러그인 인터페이스를 제공하지만 범위는 esbuild와 더 비슷할 것
Rolldown 을 개발하는 이유
- 현재 Vite는 내부적으로 두 개의 번들러를 사용
- esbuild : 종속성 사전 번들링, TypeScript / JSX 변환, 타겟 낮추기 및 minification을 위해 사용
- Rollup : 프로덕션 빌드에 사용하며 롤업 호환 플러그인 인터페이스를 지원
- 두 번들러 모두 훌륭하지만, 각각 다른 번들러가 제공하는 기능이 부족하기 때문
- esbuild는 매우 빠르고 기능이 풍부하지만 출력, 특히 청크 분할 제한 측면에서 애플리케이션을 번들링하는 데 적합하지 않음
- Rollup은 애플리케이션을 번들링하기 위해 성숙하고 실전 테스트를 거쳤지만 네이티브 언어로 컴파일된 번들러보다 훨씬 느림
- 두 개의 다른 번들러를 사용해야 하는 것은 여러 가지 면에서 최적이 아님
- 출력 간의 미묘한 차이로 인해 개발 빌드와 프로덕션 빌드 간에 동작 차이가 발생할 수 있음
- 사용자 소스는 프로덕션 빌드 내내 여러 도구에 의해 반복적으로 구문 분석, 변환 및 직렬화되므로 피할 수 있는 많은 오버헤드가 발생
- 이상적으로는 Vite가 네이티브 수준의 성능, 구문 분석/직렬화 오버헤드를 방지하는 내장 트랜스폼, 롤업과 호환되는 플러그인 인터페이스, 대규모 애플리케이션에 적합한 고급 빌드 출력 제어 기능을 제공하는 단일 번들러를 활용할 수 있기를 바람
- 이게 바로 우리가 Rolldown을 구축하는 이유
- Rolldown은 Rust로 작성되었으며 현재 파서와 리졸버를 활용하는 Oxc 위에 구축됨. 또한 향후 Oxc의 트랜스포머와 미니파이너가 출시되면 이를 활용할 계획
- 장기적인 목표는 Vite 사용자가 (프레임워크를 통해 직간접적으로) 마찰을 최소화하면서 내부적으로 롤다운을 사용하는 Vite 버전으로 전환할 수 있도록 하는 것
- 동시에 롤다운은 독립형 번들러로도 바로 사용할 수 있게 될 것
Rollup 호환성 및 차이점
- Rolldown은 Rollup의 API 및 플러그인 인터페이스와 최대한 일치하여 쉽게 채택할 수 있도록 하는 것을 목표로 함
- 간단한 사용 사례에서는 Rollup을 대체하는 역할을 할 수 있을 것. 그러나 특히 고급 옵션이 관련된 엣지 케이스에서는 약간의 차이가 있을 수 있음
- JS에서 Rust로 포팅하려는 의도로 시작했지만, 곧 최상의 성능을 달성하기 위해서는 Rust의 작동 방식에 맞춰 코드를 작성하는 것이 우선시되어야 한다는 것을 깨달았음
- Rolldown의 내부 아키텍처는 Rollup보다는 esbuild에 더 가깝고, 청크 분할 로직도 Rollup의 그것과 다를 수 있음
- Rolldown의 범위도 Rollup보다 더 넓고 esbuild와 더 유사. CommonJS 지원, node_modules 해상도가 기본으로 제공되며 향후에는 TypeScript / JSX 변환 및 축소도 지원할 예정