Vite 7.3.6 vs Parcel 2.16.4 on a 40-page React 19 TS fixture (147 modules): cold serve-ready median 692 ms vs 1,718 ms (~2.5x); cold prod build wall median 2,586 ms vs 1,806 ms; JS 228,426 B vs 227,172 B with Parcel --no-source-maps.
5 min read
I timed Vite 7.3.6 and Parcel 2.16.4 on the same 40-page React 19 TypeScript fixture: cold vite was ready in a median 0.69 s, while cold parcel took 1.72 s (about 2.5x). Cold production builds flipped the other way: Parcel finished in 1.81 s wall clock, Vite in 2.59 s, with nearly the same JS output size (228 KB vs 227 KB).
Short answer: pick Vite if daily cold and hot reload speed matters more than a one-shot production build, which is most app teams. Stay on Parcel if you like zero-config HTML entry builds and your CI already budgets for Parcel's cache model. No affiliate links in this post.
/workspace/bench-vite-parcel/. One index.html entry, React 19.3.0, 40 chained page modules, 40 components, 40 tiny utils (147 modules transformed under Vite). TypeScript with @vitejs/plugin-react for Vite; Parcel default config for the HTML entry.vite build and parcel build ... --no-cache --no-source-maps. Dev servers used vite --port 5173 --strictPort and parcel src/index.html --port 1234 --no-cache.performance.now() around a fresh child process. Seven interleaved cold builds per tool; five interleaved cold serve-ready runs per tool (ready when Vite printed ready in, Parcel printed its local URL)..map file. After --no-source-maps, sizes matched Vite. Speed ranking did not change.| Metric | Vite 7.3.6 | Parcel 2.16.4 |
|---|---|---|
| Cold prod build wall median (7 runs) | 2,586 ms | 1,806 ms |
| Tool-reported build median | 1.90 s | 1.11 s |
| Main JS bytes (no source maps) | 228,426 | 227,172 |
| Cold wait until ready (5 runs) | 692 ms | 1,718 ms |
On this fixture, yes for a cold production build. Parcel's wall clock was about 30% lower. Output size was a wash once source maps were off. If your release job only runs build once per commit, that gap is real but small next to install and test time.
For other bundler choices on this site, see the Rspack vs webpack post and the Rolldown vs Rollup post.
On cold start, yes. Waiting until the URL was usable took 0.69 s with Vite and 1.72 s with Parcel after wiping caches. That is the number I would optimize for if I restart the dev server often. I did not measure HMR after the first edit; both tools are fine there for a fixture this size, and a larger app could change the ranking.
Recent Vite point-release notes on this site live in the Vite 8.3.2 upgrade post. For a wider toolchain pitch, see Vite+ 1.0.
| Situation | My pick |
|---|---|
| App team that restarts the dev server many times a day | Vite |
| You already use Vite plugins, Vitest, or Vite SSR | Stay on / move to Vite |
| Simple static HTML entry, happy with Parcel defaults | Stay on Parcel |
| CI cares only about one cold production build and nothing else | Parcel won that single metric here |
| You need source maps in dist and forgot to turn them off | Check Parcel output size before comparing |
Bottom line: 0.69 s versus 1.72 s to a usable cold dev server is the decision number for me. Who should not switch yet: teams with a large Parcel-specific config and custom transformers, where migration cost dwarfs a one-second ready gap. For minify choices after the bundler, see the SWC vs esbuild vs Babel post; for package-manager install speed around either tool, see pnpm vs npm vs Bun.
How this was made: I generated the 40-page fixture, installed Vite and Parcel on the ShopperCove test box, timed interleaved cold builds and cold serve-ready runs, and kept the 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:45-23:52 IST (8 vCPU Intel Xeon / 15 GB shared Linux, Node 20.19.2). Fixture: /workspace/bench-vite-parcel/ — React 19.3.0, 40 pages + 40 components + 40 utils, Vite @vitejs/plugin-react, Parcel HTML entry. Tools: Vite 7.3.6, Parcel 2.16.4. Cleared dist + .parcel-cache + node_modules/.vite each run. 7 interleaved cold builds: vite wall median 2586 ms (reported 1900 ms), parcel --no-cache --no-source-maps wall median 1806 ms (reported 1110 ms); JS bytes 228426 vs 227172. 5 interleaved cold serve-ready: vite 692 ms, parcel 1718 ms. Default Parcel source maps inflated dist to ~2.1 MB (1.9 MB .map); disabled for fair size. Raw: /workspace/bench-vite-parcel/res-vite-parcel2.json. Not tested: HMR edit latency, CSS, code-splitting, SSR, Yarn PnP, Windows/macOS, large monorepos, multi-day Parcel cache. No affiliate.
vite-plugin-checker 0.10.3 with enableBuild on Vite 7.3.6 / TS 5.9.3 / React 19: clean wall medians plain 1,949 ms vs checker 2,018 ms (+69 ms) vs tsc --noEmit 985 ms. Injected TS error: plain vite exit 0 (ships dist) x3; checker exit 2 x3; tsc exit 2 x3. Fixture 122 modules.
Hands-on6 Oct 20265 min read
oxlint published v1.87.0 on 5 October 2026: suggestion support for three React/unicorn rules and jsx-a11y/label/mouse/lang hardening plus other fixes. npm latest 1.87.0 confirmed; ShopperCove docs checklist only; no affiliate.
Summary5 Oct 20264 min read
Summary3 Oct 20268 min read