Plate 31
Should You Leave Rollup? 964ms vs 246ms
Rolldown 1.2.12 vs Rollup 4.64.0 on 501 ESM files (197380 B source): median wall 245.617 ms vs 964.3 ms (~3.9x). Output 130522 vs 126894 B. Direct node bin, 5 interleaved warm runs, no minify.
Aditya Challa4 min read
On a 501-file ESM tree (197,380 bytes of source), Rollup 4.64.0 took a median 964 ms to produce one ES bundle. Rolldown 1.2.12 took 246 ms on the same machine, about 3.9x faster. Same entry, interleaved warm CLI runs, no minify.
Short answer: leave Rollup for Rolldown when library or app bundle time is the pain and you can live without a Rollup plugin that Rolldown does not yet match. Keep Rollup when a plugin, output option, or CI contract still assumes classic Rollup. No affiliate links in this post.
What I tested
- Machine: 8 vCPU Intel Xeon / 15 GB RAM Linux cloud box, Node 20.19.2, tested 5 Oct 2026 (about 23:00 to 23:10 IST). Shared box; tools interleaved each round.
- Fixture: 500 generated ESM modules plus a barrel
src/index.js(501 files, 197,380 bytes). Modules form a shallow import chain and re-export from the barrel. - Tools:
rollup4.64.0 CLI (src/index.js -o dist-rollup.js -f es --silent);rolldown1.2.12 CLI (src/index.js -o dist-rolldown.js -f esm). Timed via directnodeon each package bin (nonpxwrapper). - Timing: one warmup each, then five interleaved warm runs. Median wall-clock of the full CLI call.
- Output bytes: Rollup 126,894 B; Rolldown 130,522 B (about 3% larger on this fixture).
- One surprise: Rolldown was about 3.9x faster, but the Rolldown bundle was larger, not smaller, so speed alone is not a ship-size win.
- Not tested: tree-shaking quality on a real app, code-splitting / multi-chunk apps, Rollup plugin compatibility matrix, TypeScript input, sourcemaps, watch mode, minify paths, Windows/macOS, Vite's own Rolldown integration.
Is Rolldown faster than Rollup?
| Tool | Median | Runs (ms) | Output bytes |
|---|---|---|---|
| Rolldown 1.2.12 | 246 ms | 226 / 247 / 225 / 311 / 246 | 130,522 |
| Rollup 4.64.0 | 964 ms | 964 / 959 / 913 / 973 / 980 | 126,894 |
On this fixture Rolldown finished about 3.9x faster. Byte totals were close, with Rollup slightly smaller. The leave-Rollup case is strongest when a single-file ES build still costs near a second in CI and your plugin set already works on Rolldown.
If your pain is transform or minify rather than graph bundling, the SWC vs esbuild vs Babel post and the Terser vs esbuild vs SWC minify post are the sibling decisions on this site. Bundler choice for apps is covered in the Rspack vs Webpack post.
What do you lose leaving Rollup?
Rollup's plugin ecosystem and long-stable output options are still the safe default for many library builds. A plugin that only ships a Rollup 3/4 plugin API, or a CI script that asserts exact Rollup chunk names, can block a switch even when the CLI is faster.
Also re-check output size and tree-shaking on your own entry points. Here Rolldown was faster and about 3% larger; your app may flip that. Re-time with the same entry, format, and external list before rewriting the release job.
Should you leave Rollup for Rolldown?
| Situation | My pick |
|---|---|
| Single-file ES/CJS library build still near a second in CI | Try Rolldown; measure your entry the same way |
| Already on Vite and waiting for its Rolldown path | Follow Vite's rollout; do not dual-maintain two bundlers |
| Depends on a Rollup-only plugin or exact chunk contract | Keep Rollup until that plugin ships Rolldown support |
| Need the smallest possible ship bytes on this fixture style | Re-measure; Rollup was slightly smaller here |
| First PR would only change the bundler binary | Fine to trial Rolldown behind a flag |
Bottom line: on 501 files, Rollup took 964 ms and Rolldown took 246 ms. Who should not switch yet: teams blocked on a Rollup-only plugin or an output contract Rolldown does not match. Everyone else still paying near a second for a simple ES bundle should measure their own entry the same way.
How this was made: I generated the fixture, ran interleaved Rollup and Rolldown CLI builds on the ShopperCove test box, and kept the timing JSON; the write-up was drafted with AI help and checked against that output.
Sources
- https://rolldown.rs/
- https://github.com/rolldown/rolldown
- https://rollupjs.org/
- https://www.npmjs.com/package/rolldown
- https://www.npmjs.com/package/rollup
- https://vite.dev/
Related
- https://www.shoppercove.com/blog/swc-vs-esbuild-babel
- https://www.shoppercove.com/blog/terser-vs-esbuild-swc-minify
- https://www.shoppercove.com/blog/rspack-vs-webpack
- https://www.shoppercove.com/blog/vite-8-3-2-renderbuilturl-bundled-dev-sourcemaps-october-2026
- https://www.shoppercove.com/blog/vite-plus-1-0-unified-toolchain-october-2026
- https://www.shoppercove.com/blog/webpack-5-111-esm-output-stable-september-2026
- https://www.shoppercove.com/blog/pnpm-vs-npm-vs-bun
- https://www.shoppercove.com/blog/turborepo-2-11-7-sdkroot-oidc-cache-october-2026
Lab evidence
What I found running this
Hands-on on ShopperCove box 5 Oct 2026 ~23:00-23:10 IST (8 vCPU Intel Xeon / 15 GB shared Linux, Node 20.19.2). Fixture: 500 generated ESM modules + barrel src/index.js (501 files, 197380 bytes), shallow import chain. Versions: rollup 4.64.0 (CLI src/index.js -o dist-rollup.js -f es --silent); rolldown 1.2.12 (CLI src/index.js -o dist-rolldown.js -f esm). Timed via direct node on package bins (no npx). Wall medians (5 interleaved after warmup): rollup 964.3 ms (964.3/959.079/913.452/972.695/980.354); rolldown 245.617 ms (225.715/247.253/224.618/311.237/245.617). Output bytes: rollup 126894; rolldown 130522 (~3% larger). Raw: /workspace/bench-rolldown/res-rolldown.json. Not tested: tree-shaking quality on a real app, code-splitting, Rollup plugin matrix, TypeScript input, sourcemaps, watch, minify, Windows/macOS, Vite Rolldown integration. No affiliate.
Related links
Plate 10
Rspack 2.2.8: resolver cache, memory shrinks, modern-module deferral (28 Sep 2026)
Rspack published @rspack/core@2.2.8 on 28 September 2026: resolver caching, memory shrinks, and modern-module deferral fixes on the 2.2 line. Upgrade checklist only; no affiliate.
5 Oct 2026
Plate 45
Should You Leave Depcruise? 679ms Test
Madge 8.0.0 vs dependency-cruiser 16.10.2 on 116 JS files: median wall 679 ms vs 1122 ms (~1.65x). Both found the same 2 circular dependency groups. Depcruise also reported 120 modules / 193 dependencies.
5 Oct 2026
Plate 74
Should You Leave Terser? 824ms vs 41ms
Terser 5.51.2 vs esbuild 0.28.2 vs SWC 1.16.13 minify on a 403,418-byte unminified ESM bundle (800 modules): medians 824 ms / 41 ms / 70 ms. Output sizes 219492 / 207619 / 199712 B. Leave Terser if you only need fast minify; keep it for Terser-only compress options.
5 Oct 2026