Vite 8.3.2 plain vs Vite 8.3.2 + vite-plugin-pwa 2.0.0 generateSW on a 40-card vanilla app (minify off). Warm medians (7 rounds, cache cleared): plain 202 ms vs PWA 1,452 ms (+1,250 ms). Dist 4,426 B / 5 files → 21,142 B / 8 files (sw.js 1,347 B, workbox 15,026 B, manifest 293 B). Fixture /workspace/bench-vite-pwa/.
4 min read
I timed seven clean Vite 8.3 builds of a 40-card static app on this box: plain median 202 ms, with vite-plugin-pwa 1,452 ms — about +1.25 s (+619%) for generateSW, a webmanifest, and Workbox.
Short answer: worth it if you need installability or offline caching; skip it if you only want a fast static deploy and no service worker. No affiliate links in this post.
vite build with local binary; dist + node_modules/.vite cleared each run; 1 warm-up each config, then 7 interleaved timed rounds. minify and cssMinify off so the gap is plugin work, not terser.| Build | Median wall | Min / Max | Dist files / bytes |
|---|---|---|---|
| Vite 8.3 plain | 202 ms | 194 / 240 | 5 / 4,426 B |
| Vite 8.3 + vite-plugin-pwa | 1,452 ms | 1,371 / 1,670 | 8 / 21,142 B |
Same source, same box, caches cleared. The plugin ran Workbox generateSW after the Rollup emit; that post-pass dominated the stopwatch on this small app.
For Vite baseline context on this site, see Vite vs Parcel and Vite 8.3.2 renderBuiltUrl notes. If you already run type-checking in Vite, compare vite-plugin-checker vs tsc.
No. Bytes matter for clients; wall clock matters for CI. Here the client picked up ~16.5 KB of SW+Workbox+manifest on top of icons, and CI paid about 1.25 s per clean build. On a huge asset graph the precache step can grow further; I did not scale the fixture.
Vite Plus 1.0 toolchain notes cover a different "one toolchain" bet. This post is narrower: do you want vite-plugin-pwa's generateSW on an ordinary Vite app.
| Situation | My pick |
|---|---|
| Marketing site, no offline need | Skip the plugin |
| Installable app / field tool with flaky network | Enable generateSW |
| CI already slow and deploys are static-only | Skip until product asks for a SW |
| Need custom SW logic (push, complex routing) | Consider injectManifest later; not tested here |
| Watching transfer size budgets | Pair with size-limit vs bundlesize |
| CSS tooling decision in the same stack | See Lightning CSS vs PostCSS |
Bottom line: on a 40-card Vite 8.3 app, vite-plugin-pwa moved median build from 202 ms to 1,452 ms and added sw.js plus ~15 KB Workbox. Who should not add it: teams that do not need a service worker and already guard CI minutes.
How this was made: I scaffolded a vanilla Vite app on the ShopperCove box, built it seven times with and without vite-plugin-pwa after warm-ups and cache clears, recorded JSON medians and dist artifacts; the write-up was drafted with AI help and checked against that output.
Lab evidence
Hands-on on ShopperCove box 6 Oct 2026 ~00:18–00:19 IST (8 vCPU Intel Xeon / 15 GB shared Linux, Node 22.20.0). Vite 8.3.2 vs Vite 8.3.2 + vite-plugin-pwa 2.0.0 (generateSW, autoUpdate, injectRegister false). Fixture /workspace/bench-vite-pwa/: 40-card vanilla HTML/CSS; minify off; dist + .vite cleared each run; 1 warm-up + 7 interleaved rounds. Medians plain 202 ms (194–240) vs PWA 1,452 ms (1,371–1,670); delta +1,250 ms. Dist 5/4,426 B → 8/21,142 B; manifest 293 B, sw.js 1,347 B, workbox 15,026 B. Raw: /workspace/bench-vite-pwa/res-vite-pwa.json. Not tested: injectManifest, push, large precache, Safari install, SSR, Windows/macOS. No affiliate.