工作区
Vitest 通过工作区配置文件提供对 monorepo 的内置支持。你可以创建一个工作区来定义你的项目设置。
定义一个工作区
工作区的根目录中应该有一个 vitest.workspace
或 vitest.projects
文件(如果存在配置文件,则与其在同一文件夹中)。Vitest 支持此文件的 ts
/js
/json
扩展名。
工作区配置文件应有一个默认导出,包含引用项目的文件或 glob 模式列表。例如,如果你有一个名为 packages
的文件夹,其中包含你的项目,你可以使用以下配置文件定义一个工作区:
export default ['packages/*'];
Vitest 会将 packages
目录下的每个文件夹视为独立项目,即使其内部没有配置文件。
WARNING
Vitest 不会将根配置视为工作区项目(因此它不会运行在 include
中指定的测试),除非它在此配置中指定。
你还可以使用其配置文件引用项目:
export default ['packages/*/vitest.config.{e2e,unit}.ts'];
此模式仅包括文件名包含 e2e
和 unit
的 vitest.config
文件中的项目。
WARNING
如果你使用 glob 模式引用文件名,请确保配置文件以 vite.config
或 vitest.config
开头。否则,Vitest 将跳过它。
你还可以使用内联配置定义项目。工作区文件支持同时使用这两种语法。
import { defineWorkspace } from 'vitest/config';
// defineWorkspace 提供了良好的类型提示,改善了开发者体验(DX)
export default defineWorkspace([
'packages/*',
{
// 添加 "extends" 以将两个配置合并在一起
extends: './vite.config.js',
test: {
include: ['tests/**/*.{browser}.test.{ts,js}'],
// 建议在使用内联配置时为项目定义名称
name: 'happy-dom',
environment: 'happy-dom',
},
},
{
test: {
include: ['tests/**/*.{node}.test.{ts,js}'],
name: 'node',
environment: 'node',
},
},
]);
WARNING
所有项目应具有唯一名称。否则,Vitest 会抛出错误。如果未在内联配置中提供名称,Vitest 将分配一个数字。如果使用 glob 语法定义的项目配置中没有提供名称,Vitest 默认会使用目录名。
如果你不依赖内联配置,你只需在根目录中创建一个小的 json 文件:
["packages/*"]
工作区项目不支持所有配置属性。为了更好的类型安全,请在项目配置文件中使用 defineProject
而非 defineConfig
方法:
import { defineProject } from 'vitest/config';
export default defineProject({
test: {
environment: 'jsdom',
// "reporters" 在项目配置中不受支持,
// 因此会显示一个错误
reporters: ['json'],
},
});
配置
任何配置选项均不从根级别的配置文件继承。你可以创建一个共享配置文件,并将其与项目配置合并:
import { defineProject, mergeConfig } from 'vitest/config';
import configShared from '../vitest.shared.js';
export default mergeConfig(
configShared,
defineProject({
test: {
environment: 'jsdom',
},
})
);
此外,某些配置选项在项目配置中不被允许。最值得注意的是:
coverage
:覆盖率是针对整个工作区计算的reporters
:仅支持根级别的报告器resolveSnapshotPath
:仅遵循根级别的解析器- 所有其他不影响测试运行器的选项
TIP
所有在项目配置中不受支持的配置选项在 "Config" 页面中都有 * 标记。
覆盖率
工作区项目的覆盖率开箱即用。但是,如果你启用了 all
选项,并且某些项目中使用了非常规的扩展名,你需要在根配置文件中添加一个处理此扩展名的插件。
例如,如果你有一个使用 Vue 文件的包,并且它有自己的配置文件,但某些文件未在你的测试中导入,则覆盖率分析将无法处理未使用文件的情况,因为它依赖于根配置而非项目配置。