Every tool in this section can ship a fast site; the differences lie in defaults, ecosystem and how much configuration you want to own. To compare defaults, the same small app (one module, one stylesheet, one SVG logo) was built with each tool in production mode:
| Tool | JavaScript | CSS | How the CSS and SVG ship |
|---|---|---|---|
| esbuild 0.28 126 | 132 B | 58 B | Separate files |
| Parcel 2.16 195,638 | 119 B | 108 B | Separate files |
| Rspack 2.2 | 879 B | 148 B | Separate files, small runtime |
| Vite 8.3 25,978 | 939 B | 58 B | SVG inlined as data URI |
| webpack 5.111 3,824 | 5,963 B | none | CSS injected by style-loader |
The numbers show defaults, not limits: webpack with mini-css-extract-plugin also writes a separate CSS file, and Vite's extra bytes are the inlined logo and a small polyfill for <link rel="modulepreload">. On real applications, build time and plugin support matter far more than a few hundred bytes.
Use these rules of thumb:
New app or site: Vite, or the framework starter built on it (Nuxt 37,147 , SvelteKit 36,701 , Astro 17,728 , React Router 139,386 ). It combines a large plugin ecosystem with fast HMR.
Next.js 10,514 app: Turbopack 10,514 , which Next.js 16 uses by default.
Large existing webpack app: stay on webpack 5 if builds are acceptable; if not, move to Rspack before considering a rewrite of the configuration.
Library for npm 2,036 : Rolldown 181,166 or Rollup 141,981 directly, or a wrapper such as tsdown 4,285 , to emit clean ES modules with type declarations.
Zero-config prototype or multi-page static site: Parcel.
Scripts, CLIs and one-off bundles: esbuild.
A few pages with light JavaScript: no bundler at all; native ES modules and an import map are enough.
Interviews usually probe concepts rather than tools: what tree shaking requires, why content hashes allow long-term caching, and why Vite's dev server does not bundle your source.