Build Tools Comparison

June 1, 2026 · View on GitHub

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

Metrics

NameDescription
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
HMRTime 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 sizeTotal size of the output bundle, minified with the default minifier
Gzipped sizeGzipped 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.

Tooling details:

  • webpack is configured to use SWC instead of Babel / Terser.
  • Vite uses Rolldown and Oxc.

Results

Data from GitHub Actions: https://github.com/rstackjs/build-tools-performance/actions/runs/26758017737 (2026-06-01)


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:

NameStartup (no cache)Startup (with cache)HMRMemory (RSS)
Rspack CLI 2.0.51566ms🥇1163ms🥈163ms🥉347MB🥈
Rsbuild 2.0.91624ms🥈1125ms🥇206ms313MB🥇
Vite 8.0.148043ms5932ms156ms🥈502MB🥉
webpack 5.107.29135ms4602ms736ms822MB
Farm 1.7.112679ms🥉1251ms🥉151ms🥇551MB
Parcel 2.16.46230ms2287ms427ms1115MB
Utoo 1.4.913240ms12505ms206ms538MB

Build metrics:

NameBuild (no cache)Build (with cache)Memory (RSS)Output sizeGzipped size
Rspack CLI 2.0.51032ms🥉419ms🥇276MB🥇842.5kB🥈222.1kB
Rsbuild 2.0.91005ms🥈614ms🥉282MB🥈865.3kB215.2kB🥇
Vite 8.0.14789ms🥇727ms295MB🥉823.7kB🥇218.1kB🥈
webpack 5.107.27730ms2320ms688MB846.3kB🥉222.0kB🥉
Farm 1.7.112747ms1608ms390MB1089.5kB259.5kB
Parcel 2.16.45284ms1167ms1077MB966.1kB231.0kB
Utoo 1.4.98254ms542ms🥈560MB1069.4kB239.1kB

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:

NameStartup (no cache)Startup (with cache)HMRMemory (RSS)
Rspack CLI 2.0.5901ms🥇747ms🥇105ms🥈283MB🥈
Rsbuild 2.0.9992ms🥈764ms🥈132ms🥉261MB🥇
Vite 8.0.145425ms3491ms65ms🥇729MB
webpack 5.107.214189ms9222ms3314ms1818MB
Farm 1.7.111358ms🥉795ms🥉149ms512MB🥉
Parcel 2.16.414384ms2472ms739ms1805MB

Build metrics:

NameBuild (no cache)Build (with cache)Memory (RSS)Output sizeGzipped size
Rspack CLI 2.0.52014ms🥈1174ms🥈621MB🥈2794.0kB🥈679.7kB🥉
Rsbuild 2.0.92029ms🥉1043ms🥇629MB🥉2816.1kB🥉679.6kB🥇
Vite 8.0.141550ms🥇1539ms🥉656MB2630.7kB🥇693.1kB
webpack 5.107.214071ms3849ms1279MB2825.8kB679.6kB🥈
Farm 1.7.115250ms2439ms618MB🥇3544.9kB811.5kB
Parcel 2.16.413051ms2213ms1929MB3489.5kB766.7kB

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:

NameStartup (no cache)Startup (with cache)HMRMemory (RSS)
Rspack CLI 2.0.51476ms🥇987ms🥇156ms🥈355MB🥈
Rsbuild 2.0.91739ms🥈1163ms🥈184ms🥉321MB🥇
Vite 8.0.149100ms🥉4556ms🥉103ms🥇1155MB🥉
webpack 5.107.226984ms27569ms3386ms1923MB

Build metrics:

NameBuild (no cache)Build (with cache)Memory (RSS)Output sizeGzipped size
Rspack CLI 2.0.55219ms🥈1871ms🥇1121MB🥇5861.1kB🥈1367.1kB🥈
Rsbuild 2.0.95867ms🥉2367ms🥈1123MB🥈5903.4kB🥉1366.0kB🥇
Vite 8.0.143595ms🥇2571ms🥉1172MB🥉5465.6kB🥇1417.2kB
webpack 5.107.245436ms7836ms1860MB5934.3kB1368.2kB🥉

ui-components

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

Including @mui/material, @radix-ui/themes, antd, antd-mobile, @chakra-ui/react, @fluentui/react, @headlessui/react, @mantine/core, react-bootstrap, primereact, rsuite, @arco-design/web-react, @coreui/react, element-plus, ant-design-vue, naive-ui, primevue, vant, and vuetify.

CASE=ui-components pnpm benchmark

Build metrics:

NameBuild (no cache)Build (with cache)Memory (RSS)Output sizeGzipped size
Rspack CLI 2.0.57929ms🥉2628ms🥈1400MB🥇5067.0kB🥈1456.1kB🥇
Rsbuild 2.0.98488ms3083ms1510MB🥈5067.0kB🥉1456.1kB🥈
Vite 8.0.146176ms🥈5067ms1724MB5076.0kB1462.3kB
webpack 5.107.249698ms25745ms2235MB5062.7kB🥇1456.1kB🥉
esbuild 0.28.05294ms🥇3512msN/A6217.3kB1799.8kB
Farm 1.7.1121637ms6944ms2246MB8039.6kB2716.1kB
Parcel 2.16.436322ms2957ms🥉2148MB5320.5kB1495.7kB
Utoo 1.4.952702ms1100ms🥇1671MB🥉6649.9kB1839.6kB

A browser app that imports a small number of live exports from 50 popular, modern frontend libraries to compare tree-shaking quality across bundlers.

It keeps the original React/Vue/state/data set and adds 30 more mainstream frontend packages with ESM-friendly entry points where practical, including axios, dayjs, clsx, tailwind-merge, class-variance-authority, i18next, react-i18next, vue-i18n, immer, swr, framer-motion, three, lucide-react, @headlessui/react, @headlessui/vue, @heroicons/react, @heroicons/vue, @radix-ui/react-slot, query-string, mitt, fuse.js, idb, dexie, ky, lit, xstate, preact, solid-js, swiper, and remeda.

CASE=popular-libs pnpm benchmark

Build metrics:

NameBuild (no cache)Build (with cache)Memory (RSS)Output sizeGzipped size
Rspack CLI 2.0.51668ms466ms🥈434MB🥇1803.7kB🥉562.8kB🥉
Rsbuild 2.0.91746ms481ms🥉443MB🥈1803.0kB🥈562.5kB🥈
Vite 8.0.141023ms🥉948ms646MB1805.2kB565.4kB
Rollup 4.60.46657ms6751ms1263MB1637.7kB🥇507.8kB🥇
Rolldown 1.0.3812ms🥈797ms571MB1804.8kB564.0kB
webpack 5.107.28414ms1758ms1341MB1804.8kB563.0kB
esbuild 0.28.0670ms🥇630msN/A2104.7kB636.0kB
Farm 1.7.113499ms1248ms775MB2274.5kB771.5kB
Utoo 1.4.98443ms352ms🥇560MB🥉2126.3kB638.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
cd cases/popular-libs

# Dev server
pnpm start:rspack # Start Rspack
pnpm start:rsbuild # Start Rsbuild
pnpm start:webpack # Start webpack
pnpm start:vite # Start Vite
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: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
CASE=popular-libs 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!