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.
4 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.
src/index.js (501 files, 197,380 bytes). Modules form a shallow import chain and re-export from the barrel.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 each package bin (no npx wrapper).| 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.
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.
| 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.
Lab evidence
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.
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.
Summary5 Oct 20264 min read
Hands-on6 Oct 20266 min read
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.
Summary5 Oct 20264 min read