vitest-dev/vitest · error · Error
@vitest/coverage-v8 does not work with
Error message
@vitest/coverage-v8 does not work with
${browserConfig}
Use either:
${correctExample}
...or change your coverage provider to:
${coverageExample}
What it means
V8 coverage (`@vitest/coverage-v8`) collects coverage through Node's V8 inspector and only works while tests execute in a Node-controlled Chromium over CDP. When a browser project runs through the `preview` provider or a non-Chromium browser (playwright firefox/webkit, or webdriverio with a non-chrome/edge browser), V8 coverage cannot collect anything, so Vitest aborts project resolution and prints both a working browser-provider example and an Istanbul-coverage alternative.
Solutions
- Switch coverage to Istanbul: set `coverage: { provider: 'istanbul' }` in the project config (or globally).
- Or keep v8 coverage and point the browser instance at a Chromium-based target: `provider: 'playwright'` with `browser: 'chromium'`, or `provider: 'webdriverio'` with `browser: 'chrome'`/`'edge'`.
- Or disable coverage for that browser project (`coverage: { enabled: false }`).
Example fix
// before
export default defineConfig({
test: {
coverage: { provider: 'v8', enabled: true },
browser: { provider: 'playwright', instances: [{ browser: 'firefox' }] },
},
})
// after (option A: istanbul)
export default defineConfig({
test: {
coverage: { provider: 'istanbul', enabled: true },
browser: { provider: 'playwright', instances: [{ browser: 'firefox' }] },
},
})
// after (option B: chromium so v8 works)
export default defineConfig({
test: {
coverage: { provider: 'v8', enabled: true },
browser: { provider: 'playwright', instances: [{ browser: 'chromium' }] },
},
}) Defensive patterns
Strategy: validation
Validate before calling
// Reject v8 coverage combined with a non-CDP browser instance before starting Vitest.
function isChromiumTarget(provider: string | undefined, browser: string) {
if (provider === 'playwright') return browser === 'chromium'
if (provider === 'webdriverio') return browser === 'chrome' || browser === 'edge'
return false // 'preview' and others are non-CDP
}
function assertCoverageBrowserCompatible(test: { coverage?: any; browser?: any }) {
const v8 = test.coverage?.enabled && test.coverage?.provider === 'v8'
if (!v8) return
const instances = test.browser?.instances ?? []
for (const i of instances) {
const provider = i.provider?.name ?? test.browser?.provider?.name ?? 'preview'
if (provider === 'preview' || !isChromiumTarget(provider, i.browser)) {
throw new Error(
`coverage 'v8' is incompatible with browser instance '${i.name ?? i.browser}' ` +
`(provider '${provider}'). Use provider 'istanbul' or a Chromium target.`,
)
}
}
} Prevention
- Treat `provider: 'istanbul'` as the safe default for any project that enables `browser`.
- Centralize the coverage/browser compatibility check in a shared config helper so all projects are validated.
- In CI, assert the resolved `coverage.provider` per browser project before running tests.
When it happens
Trigger: `projectConfig.coverage.enabled === true` AND `projectConfig.coverage.provider === 'v8'` AND a browser instance whose effective `provider` is `preview`, or whose `(provider, browser)` pair is non-Chromium per `isChromiumName` (playwright requires `chromium`; webdriverio requires `chrome` or `edge`). The check lives in the CDP-only branch at resolveProjects.ts:891-932.
Common situations: Copying a Node-oriented vitest config (with the default `provider: 'v8'`) into a project that enables `browser.instances` with the preview provider or playwright+firefox/webkit; enabling browser mode without realizing the default coverage provider is v8.
Related errors
- All browser instances within a project must use the same…
- "browser.instances" was set in the config, but the array is…
- browser is not initialized
- Browser Mode requires the "provider" to always be specified.
- Browser Mode was enabled, but provider was not specified…
AI-assisted analysis of vitest-dev/vitest@1fa9837ec2 (2026-08-11).
Data as JSON: /api/errors/415f6816e52d90c4.
Report an issue: GitHub.
Appendix: source
Thrown at packages/vitest/src/node/projects/resolveProjects.ts:927
browser: {
provider: ${preferredProvider}(),
instances: [
{ browser: '${preferredBrowser}' }
],
},
}
`.trim()
if (projectConfig.coverage.enabled && projectConfig.coverage.provider === 'v8') {
const coverageExample = `
{
coverage: {
provider: 'istanbul',
},
}
`.trim()
throw new Error(
`@vitest/coverage-v8 does not work with\n${browserConfig}\n`
+ `\nUse either:\n${correctExample}`
+ `\n\n...or change your coverage provider to:\n${coverageExample}\n`,
)
}
if (globalConfig.inspect || globalConfig.inspectBrk) {
const inspectOption = `--inspect${globalConfig.inspectBrk ? '-brk' : ''}`
throw new Error(
`${inspectOption} does not work with\n${browserConfig}\n`
+ `\nUse either:\n${correctExample}`
+ `\n\n...or disable ${inspectOption}\n`,
)
}
}
if (names.has(name)) {View on GitHub (pinned to 1fa9837ec2)