根本原因是vitest默认输出coverage/vitest-coverage.json,而coverage gutters仅识别lcov.info;需在vitest.config.ts中显式配置coverage: {enabled: true, provider: 'v8', reporter: ['lcov']},并确保运行npx vitest --coverage生成coverage/lcov.info。

为什么VSCode里Vitest覆盖率不显示颜色条
根本原因不是插件没装,而是Vitest默认不生成coverage/lcov.info——它输出的是coverage/vitest-coverage.json,而Coverage Gutters插件只认lcov.info格式。
-
Vitest1.6+ 默认用v8provider,但reporter: ['lcov']必须显式写,光开enabled: true没用 - 如果配置里漏了
reporter: ['lcov'],coverage/目录下只有vitest-coverage.json,插件读不到任何有效数据 -
vitest.config.ts中reportsDirectory路径若设为"./out/coverage",就得同步在 VSCode 设置里配"coverage-gutters.lcovname": "out/coverage/lcov.info"
如何让Vitest生成VSCode能读的lcov.info
关键在vitest.config.ts的coverage配置块,必须同时满足三项才生效:
-
enabled: true(开关) -
provider: 'v8'(推荐,无需额外安装包;若用'istanbul',得npm install -D vitest-coverage-istanbul) -
reporter: ['lcov', 'text-summary']('lcov'不可省,否则无lcov.info)
示例片段:
export default defineConfig({
test: {
coverage: {
enabled: true,
provider: 'v8',
reporter: ['lcov', 'text-summary'],
reportsDirectory: './coverage'
}
}
})
运行命令也得带--coverage:npx vitest --coverage或npm run test -- --coverage(注意双横线)。
VSCode里覆盖率不随保存自动刷新怎么办
手动按Coverage Gutters: Refresh太慢,真正在开发中可用的方案是绑定任务链:
- 确保
.vscode/tasks.json中测试任务设"isBackground": true,并配好problemMatcher识别Vitest完成信号(如$vitest) - 在
.vscode/launch.json中用postLaunchTask调该任务——右键“Run Test”菜单不触发,必须走launch或终端执行 - 开启插件自动轮询:
"coverage-gutters.autoRefresh": true,但它只在lcov.info文件修改时间变化时响应;--watch模式下Vitest不一定重写报告,建议用nodemon -e ts,tsx,test.ts --exec npx vitest --coverage保底
lcov.info里的SF路径和VSCode打开的文件对不上
这是染色失败最隐蔽的坑:VSCode当前打开src/utils/index.ts,但lcov.info里写的是../src/utils/index.ts或/home/user/project/src/utils/index.ts,路径不一致就全白。
- 检查
lcov.info首行类似SF:src/utils/index.ts的路径是否与 VSCode 左下角显示的文件路径完全一致(大小写、斜杠方向、相对/绝对) - TS项目尤其注意:
tsconfig.json里别设outDir干扰源码路径;collectCoverageFrom要匹配原始.ts路径,不是构建产物 - Monorepo中
Vitest可能输出相对路径(如SF:../packages/core/src/index.ts),可在配置里加all: true或用watermarks缓解,但根治需统一工作区路径
路径错位时状态栏仍显示百分比,但gutter区全空——那数字只是插件解析lcov.info后算出的理论值,和当前文件无关。











