Plate 74
vite-plugin-checker: Plain Vite Shipped My TS Error
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.
Aditya Challa5 min read
I injected one deliberate TypeScript error into a 122-module Vite 7.3 React app: plain vite build still exited 0 and wrote dist, while vite-plugin-checker 0.10 with enableBuild: true failed with exit 2. On clean builds the checker median was 2,018 ms against 1,949 ms for plain Vite (+69 ms) and 985 ms for a separate tsc --noEmit.
Short answer: turn the checker on for production builds if you do not already fail CI on tsc --noEmit. The cost here was under 4% of wall time; the win is that Vite alone will happily ship code that TypeScript rejects. No affiliate links in this post.
What I tested
- Machine: 8 vCPU Intel Xeon / 15 GB RAM shared Linux cloud box, tested 6 Oct 2026 about 00:05–00:10 IST.
- Versions: Vite 7.3.6, vite-plugin-checker 0.10.3, TypeScript 5.9.3, React 19.3.0, Node 22.20.0. Config:
@vitejs/plugin-reactpluschecker({ typescript: true, enableBuild: true }). - Fixture: /workspace/bench-vite-checker/. 60 lib modules, 60 page components, App + main (122 source files). Production builds cleared dist and Vite caches between runs.
- Timing: wall clock around each process via the local Vite and tsc binaries (no npx). One warm-up, then 7 interleaved clean rounds for plain Vite, checker Vite, and
tsc --noEmit. Then 3 rounds with anumber = "not-a-number"error in P0.tsx. - Findings: clean medians plain 1,949 ms, checker 2,018 ms (+69 ms), tsc 985 ms. With the type error: plain Vite exit 0 three times, checker exit 2 three times, tsc exit 2 three times.
- One surprise: checker wall time on the broken build (1,868 ms median) was in the same band as a clean checker build. Failing fast did not cost extra here.
- Not tested: ESLint overlay, vue-tsc, overlay UX in
vite dev, incrementaltsc -b, monorepo project references, Windows or macOS.
Does plain Vite ship TypeScript errors?
| Run (122 modules) | Exit | Ships dist? | Wall median |
|---|---|---|---|
vite build (clean) | 0 | yes | 1,949 ms |
vite build + checker enableBuild (clean) | 0 | yes | 2,018 ms |
tsc --noEmit (clean) | 0 | n/a | 985 ms |
vite build (TS error in P0) | 0 | yes | 1,895 ms |
| checker enableBuild (TS error in P0) | 2 | no | 1,868 ms |
tsc --noEmit (TS error in P0) | 2 | n/a | 1,101 ms |
Yes. esbuild strips types, so a bad assignment is invisible to the bundler. My broken P0 still produced a full dist with the same asset shape as a clean build. That is the whole reason to add a typecheck gate somewhere in CI or at build time.
If you already treat TypeScript as a hard gate, the TypeScript 7 upgrade notes and the typescript-eslint 8.71 enum assignment fix are the adjacent tooling checks.
Is +69 ms enough to notice?
On this fixture, no. Checker added about 3.5% to wall time versus plain Vite. Vite's own "built in" line moved from about 1.75 s to 1.80 s. A standalone tsc --noEmit finished in 985 ms, so if your pipeline already runs tsc in parallel with Vite, duplicating the work inside the plugin is optional rather than required.
Where checker still helps: one command, one exit code, and the same typescript config the editor uses, without wiring a second CI job. Where a separate tsc job is better: you want typecheck to fail before the slower bundle starts, or you share one tsc -b across several packages.
Should you enable vite-plugin-checker on build?
| Situation | My pick |
|---|---|
No tsc --noEmit in CI today | Enable checker with enableBuild |
| CI already fails on tsc | Optional; keep tsc, skip enableBuild |
| Library publish where types are the product | Prefer explicit tsc / api-extractor |
| Dev-only overlay, ship anyway | checker in serve, not enableBuild |
| Lint-format gate already covers types via Biome or oxlint typed rules | Re-check; see Biome vs ESLint+Prettier and oxlint vs ESLint |
Bottom line: plain Vite shipped my broken module three times; checker stopped it for about 69 ms on a clean 122-file app. Who should not bother: teams whose CI already fails on tsc --noEmit before deploy. For nearby Vite release behavior, see the Vite 8.3.2 renderBuiltUrl notes.
How this was made: I reused a 122-file React+Vite fixture on the ShopperCove test box, timed interleaved plain and checker builds, injected one type error for a fail/pass matrix, and kept the JSON; the write-up was drafted with AI help and checked against that output.
Sources
- https://github.com/fi3ework/vite-plugin-checker
- https://www.npmjs.com/package/vite-plugin-checker
- https://vite.dev/guide/build.html
- https://www.typescriptlang.org/docs/handbook/compiler-options.html
- https://github.com/vitejs/vite
Related
- https://www.shoppercove.com/blog/typescript-7-should-you-upgrade
- https://www.shoppercove.com/blog/typescript-eslint-8-71-no-unsafe-enum-assignment-october-2026
- https://www.shoppercove.com/blog/biome-vs-eslint-prettier
- https://www.shoppercove.com/blog/oxlint-vs-eslint
- https://www.shoppercove.com/blog/vite-8-3-2-renderbuilturl-bundled-dev-sourcemaps-october-2026
- https://www.shoppercove.com/blog/vite-plus-1-0-unified-toolchain-october-2026
- https://www.shoppercove.com/blog/knip-vs-depcheck
- https://www.shoppercove.com/blog/dprint-vs-prettier
Lab evidence
What I found running this
Hands-on on ShopperCove box 6 Oct 2026 ~00:05–00:10 IST (8 vCPU Intel Xeon / 15 GB shared Linux, Node 22.20.0). Vite 7.3.6, vite-plugin-checker 0.10.3 (typescript: true, enableBuild: true), TypeScript 5.9.3, React 19.3.0, @vitejs/plugin-react. Fixture /workspace/bench-vite-checker/: 60 lib + 60 pages + App/main (122 files). Local vite/tsc binaries, no npx. Caches/dist cleared each run. 1 warm-up + 7 interleaved clean rounds: wall medians plain 1949 ms, checker 2018 ms (+69 ms), tsc --noEmit 985 ms. Then 3 rounds with deliberate number = "not-a-number" in P0.tsx: plain vite exit 0 (ships) x3; checker exit 2 x3; tsc exit 2 x3. Raw: /workspace/bench-vite-checker/res-vite-checker.json. Not tested: ESLint overlay, vue-tsc, vite dev overlay UX, tsc -b project references, Windows/macOS. No affiliate.
Related links
Plate 46
esbuild-register vs jiti: 343ms vs 540ms Cold
esbuild-register 3.6.0 vs jiti 2.7.0 on a 61-file TypeScript graph: cold wall medians 343 ms vs 540 ms (~1.57x); after jiti disk cache warm, 185 ms vs esbuild-register 350 ms. Same printed result 970.
5 Oct 2026
Plate 93
Vite vs Parcel: 0.69s vs 1.72s Cold Dev Start
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 Oct 2026
Plate 69
oxlint vs ESLint: Should You Switch? 9.8s vs 0.09s
oxlint 1.87.0 vs ESLint 9.39.4 on react-hook-form (301 files): 0.09 s vs 9.81 s single-thread (6.02 s with --concurrency auto, 1.10 s warm --cache). @oxlint/migrate ported 42 of 84 rules natively, 80 with JS plugins. 315 vs 562 warnings; seeded test 11/15 native, 13/15 with JS plugins, ESLint 15/15.
5 Oct 2026