Skip to content

Benchmarks for bundlers and build tools, including Rspack, Rsbuild, webpack, Vite, Rolldown, esbuild, Parcel and Farm.

License

Notifications You must be signed in to change notification settings

rspack-contrib/build-tools-performance

Repository files navigation

Build Tools Comparison

Benchmark comparing JavaScript bundlers and build tools (Rspack, Rsbuild, webpack, Vite, rolldown-vite, esbuild, Parcel and Farm) for dev server startup time, build performance and bundle size for applications with different module sizes.

Metrics

Name Description
Startup (no cache) Time from starting the dev server to page loaded
Startup (with cache) Time from starting the dev server to page loaded with cache
HMR Time to HMR after changing a module
Build (no cache) Time taken to build the production bundles
Build (with cache) Time taken to build the production bundles with cache
Memory (RSS) Memory usage at the end of a cold start or production build
Output size Total size of the output bundle, minified with the default minifier
Gzipped size Gzipped size of the output bundle, represents actual network transfer size

Notes

  • Build target is set to es2022 (Chrome >= 93) for all tools.
  • Minification is enabled in production for all tools.
  • Source map is enabled in development and disabled in production for all tools.
  • Benchmarks run on GitHub Actions with variable hardware, which may cause inconsistent results.

Results

Data from GitHub Actions: https://github.com/rspack-contrib/build-tools-performance/actions/runs/19323852850 (2025-11-13)

react-1k

A React app with 1,000 components and 1,500 modules from node_modules, using dynamic imports to simulate SPA.

CASE=react-1k pnpm benchmark

Development metrics:

Name Startup (no cache) Startup (with cache) HMR Memory (RSS)
Rspack CLI 1.6.1 2130ms🥉 906ms🥉 107ms🥇 351MB🥉
Rsbuild 1.6.3 1529ms🥇 801ms🥈 114ms🥈 315MB🥇
Vite (Rolldown) 7.2.2 6408ms 5185ms 138ms 401MB
Vite (Rollup) 7.2.2 7116ms 5714ms 122ms🥉 323MB🥈
webpack (SWC) 5.102.1 5150ms 3905ms 811ms 814MB
Farm 1.7.11 2018ms🥈 733ms🥇 140ms 554MB
Parcel 2.16.1 3727ms 1054ms 151ms 1170MB

Build metrics:

Name Build (no cache) Build (with cache) Memory (RSS) Output size Gzipped size
Rspack CLI 1.6.1 843ms🥈 893ms 285MB🥉 846.2kB 220.8kB🥉
Rsbuild 1.6.3 965ms🥉 721ms🥈 271MB🥈 877.9kB 214.5kB🥇
Vite (Rolldown) 7.2.2 628ms🥇 461ms🥇 242MB🥇 830.5kB🥈 226.1kB
Vite (Rollup) 7.2.2 2917ms 2073ms 502MB 805.0kB🥇 217.1kB🥈
webpack (SWC) 5.102.1 4704ms 1674ms 638MB 843.2kB🥉 226.4kB
Farm 1.7.11 1986ms 1059ms 384MB 1085.3kB 258.3kB
Parcel 2.16.1 3784ms 868ms🥉 1118MB 962.0kB 229.8kB

react-5k

A React app with 5,000 components and 5,000 modules from node_modules, using dynamic imports to simulate SPA.

CASE=react-5k pnpm benchmark

Development metrics:

Name Startup (no cache) Startup (with cache) HMR Memory (RSS)
Rspack CLI 1.6.1 2097ms🥉 1403ms🥉 209ms 292MB🥈
Rsbuild 1.6.3 1346ms🥇 1286ms🥈 107ms 265MB🥇
Vite (Rolldown) 7.2.2 5138ms 3454ms 103ms🥉 519MB
Vite (Rollup) 7.2.2 7294ms 5337ms 98ms🥈 302MB🥉
webpack (SWC) 5.102.1 19040ms 19575ms 2865ms 1401MB
Farm 1.7.11 1662ms🥈 901ms🥇 85ms🥇 500MB
Parcel 2.16.1 16033ms 3693ms 519ms 1833MB

Build metrics:

Name Build (no cache) Build (with cache) Memory (RSS) Output size Gzipped size
Rspack CLI 1.6.1 5260ms🥈 2859ms 564MB🥈 2853.6kB 679.6kB🥇
Rsbuild 1.6.3 5279ms🥉 2777ms🥉 568MB🥉 2884.7kB 680.5kB🥈
Vite (Rolldown) 7.2.2 1921ms🥇 1998ms🥇 511MB🥇 2660.3kB🥈 725.4kB
Vite (Rollup) 7.2.2 8884ms 8005ms 943MB 2582.9kB🥇 689.5kB🥉
webpack (SWC) 5.102.1 18581ms 4341ms 1231MB 2832.0kB🥉 697.9kB
Farm 1.7.11 5871ms 2420ms🥈 606MB 3540.7kB 806.8kB
Parcel 2.16.1 16973ms 2925ms 1965MB 3485.4kB 765.3kB

react-10k

A React app with 10,000 components and 10,000 modules from node_modules, using dynamic imports to simulate SPA.

CASE=react-10k pnpm benchmark

Development metrics:

Name Startup (no cache) Startup (with cache) HMR Memory (RSS)
Rspack CLI 1.6.1 1852ms🥈 1833ms🥈 117ms🥉 356MB🥈
Rsbuild 1.6.3 1188ms🥇 908ms🥇 106ms🥈 315MB🥇
Vite (Rolldown) 7.2.2 11122ms 7281ms 94ms🥇 854MB
Vite (Rollup) 7.2.2 9225ms🥉 5551ms🥉 126ms 360MB🥉
webpack (SWC) 5.102.1 19251ms 21307ms 4925ms 2088MB

Build metrics:

Name Build (no cache) Build (with cache) Memory (RSS) Output size Gzipped size
Rspack CLI 1.6.1 5604ms🥉 2589ms🥇 1014MB🥈 6003.5kB 1369.5kB🥈
Rsbuild 1.6.3 3619ms🥈 3262ms🥉 1021MB🥉 6061.8kB 1369.4kB🥇
Vite (Rolldown) 7.2.2 3283ms🥇 2987ms🥈 827MB🥇 5529.1kB🥈 1483.5kB
Vite (Rollup) 7.2.2 12025ms 14190ms 1425MB 5372.8kB🥇 1410.1kB🥉
webpack (SWC) 5.102.1 39479ms 5798ms 1854MB 5954.4kB🥉 1450.3kB

ui-components

A React app that imports UI components from several popular UI libraries.

Including @mui/material, antd, @chakra-ui/react, @fluentui/react, @headlessui/react, @mantine/core, react-bootstrap, element-plus, vant, and vuetify.

CASE=ui-components pnpm benchmark

Build metrics:

Name Build (no cache) Build (with cache) Memory (RSS) Output size Gzipped size
Rspack CLI 1.6.1 2607ms 1678ms 605MB🥈 2056.8kB🥉 629.6kB🥈
Rsbuild 1.6.3 3655ms 2395ms 637MB🥉 2054.8kB🥇 629.1kB🥇
Vite (Rollup) 7.2.2 9055ms 9101ms 1508MB 2073.6kB 650.6kB
Vite (Rolldown) 7.2.2 1893ms🥉 1724ms 905MB 2056.6kB🥈 633.1kB
Rolldown 1.0.0-beta.47 1198ms🥇 1323ms🥈 862MB 2074.1kB 635.1kB
webpack (SWC) 5.102.1 15453ms 8506ms 1730MB 2056.9kB 630.9kB🥉
esbuild 0.27.0 1746ms🥈 1643ms🥉 N/A 2896.9kB 888.7kB
Farm 1.7.11 6571ms 1923ms 1305MB 3822.7kB 1330.7kB
Parcel 2.16.1 11718ms 981ms🥇 2028MB 2095.4kB 637.6kB

rome

A complex TypeScript Node.js project that includes multiple packages from the rome toolchain.

CASE=rome pnpm benchmark

Build metrics:

Name Build (no cache) Build (with cache) Memory (RSS) Output size Gzipped size
Rspack CLI 1.6.1 591ms🥉 490ms🥉 260MB 1008.1kB🥉 270.9kB🥈
Rsbuild 1.6.3 616ms 522ms 245MB🥉 1008.0kB🥈 270.9kB🥉
Rolldown 1.0.0-beta.47 298ms🥈 301ms🥈 220MB🥈 1012.2kB 271.8kB
webpack (SWC) 5.102.1 3168ms 905ms 678MB 1006.2kB🥇 270.5kB🥇
esbuild 0.27.0 266ms🥇 256ms🥇 N/A 1025.3kB 276.7kB

Run locally

Run the benchmark.ts script to get the results (requires Node.js >= 22):

# Run the benchmark for the react-5k case
pnpm benchmark

# Run the benchmark for the react-10k case
CASE=react-10k pnpm benchmark

If you want to start the project with the specified tool, try:

pnpm i # install dependencies

# Cd to the case directory
cd cases/react-5k
cd cases/react-10k

# Dev server
pnpm start:rspack # Start Rspack
pnpm start:rsbuild # Start Rsbuild
pnpm start:webpack # Start webpack
pnpm start:vite # Start Vite
pnpm start:rolldown-vite # Start Vite (Rolldown)
pnpm start:farm # Start Farm

# Build
pnpm build:rspack # Build Rspack
pnpm build:rsbuild # Build Rsbuild
pnpm build:webpack # Build webpack
pnpm build:vite # Build Vite
pnpm build:rolldown-vite # Build Vite (Rolldown)
pnpm build:farm # Build Farm

Options

Use CASE to switch the benchmark case:

CASE=react-1k pnpm benchmark
CASE=react-5k pnpm benchmark
CASE=react-10k pnpm benchmark

Use TOOLS to specify the build tools or bundlers:

# Run with all tools
TOOLS=all pnpm benchmark

# Run Rspack and Rsbuild
TOOLS=rspack,rsbuild pnpm benchmark

Use RUN_TIMES to specify the number of runs (defaults to 3):

RUN_TIMES=3 pnpm benchmark

Use WARMUP_TIMES to specify the number of warmup runs (defaults to 2):

WARMUP_TIMES=2 pnpm benchmark

Use FARM=true to run Farm:

FARM=true pnpm benchmark

Credits

Forked from farm-fe/performance-compare, thanks to the Farm team!

About

Benchmarks for bundlers and build tools, including Rspack, Rsbuild, webpack, Vite, Rolldown, esbuild, Parcel and Farm.

Topics

Resources

License

Stars

Watchers

Forks