ShopperCove
Menu
All writingBlogTopicsCategoriesAboutRSS
Blog
Categories
Observability & SRE62All categories
About

Plate 74

  1. Blog

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 Challa·5 October 2026·5 min read

Hands-on
On this page
  1. What I tested
  2. Does plain Vite ship TypeScript errors?
  3. Is +69 ms enough to notice?
  4. Should you enable vite-plugin-checker on build?
  5. Sources
  6. Related

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-react plus checker({ 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 a number = "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, incremental tsc -b, monorepo project references, Windows or macOS.

Does plain Vite ship TypeScript errors?

Run (122 modules)ExitShips dist?Wall median
vite build (clean)0yes1,949 ms
vite build + checker enableBuild (clean)0yes2,018 ms
tsc --noEmit (clean)0n/a985 ms
vite build (TS error in P0)0yes1,895 ms
checker enableBuild (TS error in P0)2no1,868 ms
tsc --noEmit (TS error in P0)2n/a1,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?

SituationMy pick
No tsc --noEmit in CI todayEnable checker with enableBuild
CI already fails on tscOptional; keep tsc, skip enableBuild
Library publish where types are the productPrefer explicit tsc / api-extractor
Dev-only overlay, ship anywaychecker in serve, not enableBuild
Lint-format gate already covers types via Biome or oxlint typed rulesRe-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
vitetypescriptvite-plugin-checkerbuildcireactperformance

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.

Notes when a lab post goes up

Occasional email for new hands-on reviews. No sequence and no sponsors.

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

On this page

  1. What I tested
  2. Does plain Vite ship TypeScript errors?
  3. Is +69 ms enough to notice?
  4. Should you enable vite-plugin-checker on build?
  5. Sources
  6. Related
All writingBlogCategoriesTopicsAboutPrivacyRSS

© 2026 ShopperCove