Describe the bug
defineConfig from vite-plus always prepends Vitest-only plugins into every Vite config, including for vp build / vp dev:
vite-plus:vitest-resolver
vite-plus:auto-inline-matcher
vite-plus:coverage-version-guard
Projects that use Vite+ for toolchain (fmt / lint / build) but run tests with another runner (e.g. Bun's bun:test) still pay for these plugins on every production build.
Rolldown/Vite plugin timings report:
[PLUGIN_TIMINGS] Your build spent significant time in plugins. Here is a breakdown:
- vite-plus:vitest-resolver (87%)
The resolver is an enforce: "pre" resolveId hook, so it runs on every module resolve. It early-returns for non-vitest / @vitest/* ids, but with a large graph that still dominates plugin time.
There is no documented opt-out. lazyPlugins only gates user plugins during config-metadata loads; it does not skip these injected plugins on build/dev. vite-plus/prefer-vite-plus-imports also pushes app configs to import defineConfig from vite-plus rather than vite, so switching away isn't a clean escape hatch.
Reproduction
- Use
import { defineConfig } from "vite-plus" in an app vite.config.ts
- Do not configure or run
vp test / Vitest
- Run
vp build (with plugin timings enabled)
- Observe
vite-plus:vitest-resolver near the top of [PLUGIN_TIMINGS]
Expected
Vitest helper plugins should only be injected when running tests (vp test / Vitest), or there should be an explicit opt-out for projects that don't use Vitest.
System Info
vite-plus: 0.2.5
- Tests: Bun (
bun:test), not Vitest
- Apps build via
vp build
Suggested fix
- Gate injection on test command / presence of
test config, or
- Add a config flag such as
test: false / vitest: false to skip injection, or
- Document a supported way to opt out without fighting
prefer-vite-plus-imports
Related
Describe the bug
defineConfigfromvite-plusalways prepends Vitest-only plugins into every Vite config, including forvp build/vp dev:vite-plus:vitest-resolvervite-plus:auto-inline-matchervite-plus:coverage-version-guardProjects that use Vite+ for toolchain (
fmt/lint/build) but run tests with another runner (e.g. Bun'sbun:test) still pay for these plugins on every production build.Rolldown/Vite plugin timings report:
The resolver is an
enforce: "pre"resolveIdhook, so it runs on every module resolve. It early-returns for non-vitest/@vitest/*ids, but with a large graph that still dominates plugin time.There is no documented opt-out.
lazyPluginsonly gates user plugins during config-metadata loads; it does not skip these injected plugins onbuild/dev.vite-plus/prefer-vite-plus-importsalso pushes app configs to importdefineConfigfromvite-plusrather thanvite, so switching away isn't a clean escape hatch.Reproduction
import { defineConfig } from "vite-plus"in an appvite.config.tsvp test/ Vitestvp build(with plugin timings enabled)vite-plus:vitest-resolvernear the top of[PLUGIN_TIMINGS]Expected
Vitest helper plugins should only be injected when running tests (
vp test/ Vitest), or there should be an explicit opt-out for projects that don't use Vitest.System Info
vite-plus:0.2.5bun:test), not Vitestvp buildSuggested fix
testconfig, ortest: false/vitest: falseto skip injection, orprefer-vite-plus-importsRelated
expect.extend()to fix module instance splitting #1113lazyPlugins(user plugins only): feat: add lazyPlugins() helper for conditional plugin loading #1215