Rolldown: bundler compatible con Rollup escrito en Rust
Un nuevo bundler de JavaScript llamado Rolldown, escrito en Rust y compatible con Rollup, está generando debate sobre por qué el ecosistema necesita otra herramienta más. Sus defensores argumentan que el rendimiento de Rust, su sólido soporte para múltiples núcleos, su ecosistema de tooling emergente (como Oxc) y su compatibilidad con Rollup justifican empezar desde cero en lugar de extender bundlers basados en JavaScript o Go como Rollup y esbuild, especialmente para escenarios complejos de code-splitting y plugins. Los críticos expresan preocupación por fragmentar la cadena de herramientas y reducir la capacidad de los desarrolladores habituales de JS/TS para contribuir, mientras que otros ven la estrecha alineación de Rolldown con Vite como una vía prometedora hacia builds más rápidas y consistentes.
Motivación de Rolldown
- El proyecto se presenta como “compatible con Rollup en Rust” para corregir dos problemas percibidos: el débil code-splitting en esbuild y la lentitud de las compilaciones en Rollup.
- Los comentaristas señalan que, en la práctica, es el “Rollup de próxima generación” y también una respuesta a rspack, la alternativa a webpack basada en Rust.
- Algunos lo ven como parte de una ola más amplia de Rust en las herramientas de JS (oxc, SWC, LightningCSS, Deno, etc.).
¿Por qué no mejorar simplemente esbuild o Rollup?
- Esbuild: se informa que es muy difícil de extender; varias funciones (bundling, treeshaking, transformaciones) están fuertemente fusionadas en unos pocos pasos del AST, lo que hace que refactorizaciones sustanciales sean difíciles para cualquiera salvo el mantenedor.
- Su code-splitting está limitado por la semántica de los módulos ES y por prioridades del proyecto que favorecen la corrección sobre modos “rápidos pero quizá incorrectos”.
- Rollup: está limitado por ser basado en JS y por un mal aprovechamiento de varios núcleos; mezclar código JS con transformaciones nativas (SWC, esbuild) añade sobrecarga por pasos repetidos de parseo/serialización y cruces de la frontera JS/nativo.
¿Por qué Rust?
- Argumentos a favor de Rust: alto rendimiento, multihilo fácil con seguridad en tiempo de compilación, buena ergonomía para analizadores sintácticos (pattern matching, tipos algebraicos de datos) y un ecosistema coherente con Cargo y crates.io.
- Los críticos sostienen que cualquier lenguaje compilado AOT (Go, C#, C++) podría funcionar; para cargas de trabajo típicas de tooling, el borrow checker de Rust puede ser complejidad innecesaria o llevar al abuso de
.clone(). - Hay un amplio ida y vuelta comparando JS, Go, C++, C# y Rust en rendimiento, seguridad, velocidad de iteración y tooling (Cargo vs CMake, ausencia de un gestor de paquetes para C++, etc.).
Adopción, integración con Vite y preocupaciones del ecosistema
- Rolldown está estrechamente ligado al ecosistema de Vite; se sugiere que sea un reemplazo a largo plazo en Vite, y se menciona una experimentación temprana en materiales de Vite 5.1.
- Algunos temen que un núcleo en Rust reduzca el grupo de colaboradores, ya que la mayoría de los desarrolladores JS/TS no pueden parchearlo fácilmente.
- Otros preguntan si la calidad de salida (legibilidad, bundles no “basura”) igualará a Rollup y si evitará el hacking de cadenas estilo MagicString de Rollup transformando directamente los AST.
Casos de uso y preguntas abiertas
- El chunking se considera importante para cargar dependencias grandes y específicas de rutas, así como imports dinámicos, aunque algunos cuestionan si muchas aplicaciones realmente lo necesitan.
- No está claro cuán pronto Rolldown estará listo para producción en Vite y si unificará por completo el comportamiento de desarrollo y de build (“dev mode as build-plus”).