用途:把 packages/<name> 的单元测试从 Jest 迁移到 Vitest 4,通过 @nx/vitest 插件推断测试目标。迁移起点是 packages/workspace,而非 packages/nx。
主要能力与共享机制:复用 tools/vitest/setup.mts(scripts/unit-test-setup.js 的移植版,作为 setupFiles)、tools/vitest/nx-source-resolver.mts(把 nx / @nx/* 解析到本仓库源码)、tools/vitest/tsconfig.json(阻止 vite 向上查找 tsconfig),以及 packages/workspace/vitest.config.mts 和 project.json 中的 test.inputs。
使用方式:参数为包名(如 js、devkit、workspace),包位于 packages/<name>/。步骤包括:先调查包(jest 配置、spec 数量、当前运行时长作为对齐目标);在包根写 vitest.config.mts 并删除 jest.config.cts;接入共享 setup;更新 tsconfig.spec.json 的 types 为 vitest/globals;用 codemod 批量替换 jest.* 为 vi.*,再手工修复语义差异;最后核对测试数量与耗时。
限制与注意:Jest 与 Vitest 在模块语义上不同,机械重命名只占约 80% 的 diff。需处理冻结的 ESM 命名空间、裸 require() 加载的模块(用 mockCjsModule)、类 mock 的可构造性、vi.resetAllMocks() 行为差异、setup 中不可用 vi.fn() 做透传、beforeEach 返回函数被当作 teardown 等问题。原生 .node 绑定需 pool: 'forks'。若 spec 可写仓库文件,需通过 execArgv 加载 vitest-write-guard.cjs。共享文件需在 project.json 的 test.inputs 中声明,否则缓存不会失效。具体命令与代码以资料为准。