Claude-skill-registry-data migrating-to-vitest-4
Migrate from Vitest 2.x/3.x to 4.x with pool options, coverage config, workspace to projects, and browser mode updates. Use when upgrading Vitest versions or encountering deprecated patterns.
git clone https://github.com/majiayu000/claude-skill-registry-data
T=$(mktemp -d) && git clone --depth=1 https://github.com/majiayu000/claude-skill-registry-data "$T" && mkdir -p ~/.claude/skills && cp -r "$T/data/migrating-to-vitest-4" ~/.claude/skills/majiayu000-claude-skill-registry-data-migrating-to-vitest-4 && rm -rf "$T"
data/migrating-to-vitest-4/SKILL.mdMigrating to Vitest 4
This skill guides migration from Vitest 2.x/3.x to 4.x, focusing on breaking changes and deprecated patterns.
Migration Overview
Vitest 4.0 introduces breaking changes in:
- Pool Architecture: Consolidated worker configuration
- Coverage: Required explicit include patterns
- Workspace: Replaced by projects array
- Browser Mode: Separate provider packages
- Dependencies: Moved to server namespace
- Module Runner: New Vite-based implementation
Quick Migration Guide
Pool Configuration
Before (Vitest 3.x):
export default defineConfig({ test: { maxThreads: 4, singleThread: true, }, });
After (Vitest 4.x):
export default defineConfig({ test: { maxWorkers: 4, maxWorkers: 1, isolate: false, }, });
Coverage Configuration
Before (Vitest 3.x):
coverage: { provider: 'v8', all: true, }
After (Vitest 4.x):
coverage: { provider: 'v8', include: ['src/**/*.{ts,tsx}'], }
Workspace to Projects
Before (Vitest 3.x):
import { defineWorkspace } from 'vitest/config'; export default defineWorkspace([ { test: { name: 'unit' } }, ]);
After (Vitest 4.x):
import { defineConfig } from 'vitest/config'; export default defineConfig({ test: { projects: [ { test: { name: 'unit' } }, ], }, });
Browser Mode
Before (Vitest 3.x):
browser: { enabled: true, name: 'chromium', provider: 'playwright', }
After (Vitest 4.x):
import { playwright } from '@vitest/browser-playwright'; browser: { enabled: true, provider: playwright(), instances: [{ browser: 'chromium' }], }
Import updates:
import { page } from 'vitest/browser';
Dependencies
Before (Vitest 3.x):
deps: { inline: ['vue'], }
After (Vitest 4.x):
server: { deps: { inline: ['vue'], }, }
For detailed migration tables covering all options, see references/migration-tables.md
Migration Workflow
Step 1: Update Package
npm install -D vitest@latest
Step 2: Update Config
- Replace
/maxThreads
withmaxForksmaxWorkers - Add
patternscoverage.include - Replace
withdefineWorkspaceprojects - Move
todeps.*server.deps.* - Update browser provider imports
Step 3: Update Test Files
grep -r "@vitest/browser/context" . --include="*.ts"
Replace with:
import { page, userEvent } from 'vitest/browser';
Step 4: Install Browser Providers
If using browser mode:
npm install -D @vitest/browser-playwright
Step 5: Run Tests
vitest --run
Check for deprecation warnings.
Step 6: Verify Coverage
vitest --coverage
For complete migration workflow with troubleshooting, see references/migration-workflow.md
Migration Checklist
Configuration
- Update
to 4.xvitest - Replace
/maxThreads
withmaxForksmaxWorkers - Add explicit
patternscoverage.include - Replace
withdefineWorkspaceprojects - Move
todeps.*server.deps.* - Update browser provider config
Test Files
- Update imports from
to@vitest/browser/contextvitest/browser - Remove
importsvitest/execute
Environment
- Replace
withVITE_NODE_DEPS_MODULE_DIRECTORIESVITEST_MODULE_DIRECTORIES
Verification
- Run tests and verify no deprecation warnings
- Verify coverage reports generate correctly
Common Migration Issues
Issue: "maxThreads is not a valid option"
Solution: Replace with
maxWorkers
Issue: Coverage Reports Empty
Solution: Add explicit
coverage.include patterns
Issue: Workspace Config Not Working
Solution: Replace
defineWorkspace with defineConfig and projects
Issue: Browser Tests Fail
Solution: Install provider package and update imports
Issue: "deps.inline is not a valid option"
Solution: Move to
server.deps.inline
For detailed troubleshooting, see references/migration-workflow.md
Mock Implementation Changes
Mock Names
Returns
vi.fn() instead of spy in Vitest 4.x
Invocation Order
Starts at
1 instead of 0 (matching Jest)
Restore Mocks
No longer affects automocks
Reporter Changes
Before (Vitest 3.x):
reporters: ['basic']
After (Vitest 4.x):
reporters: ['default'], summary: false
Environment Variables
Before:
VITE_NODE_DEPS_MODULE_DIRECTORIES=/path vitest
After:
VITEST_MODULE_DIRECTORIES=/path vitest
Default Exclusions
Vitest 3.x: Excluded many directories by default
Vitest 4.x: Only excludes
node_modules and .git
Add explicit excludes if needed:
coverage: { include: ['src/**/*.ts'], exclude: [ '**/node_modules/**', '**/dist/**', '**/*.test.ts', ], }
References
For detailed migration information:
- Migration Tables - Complete before/after comparisons
- Migration Workflow - Step-by-step process with troubleshooting
For new configuration patterns, see
@vitest-4/skills/configuring-vitest-4
For browser mode setup, see
@vitest-4/skills/using-browser-mode
For complete API reference, see
@vitest-4/knowledge/vitest-4-comprehensive.md