fsModuleCache 5.0.0+
- 类型:
boolean - 默认值:
false - CLI:
--fsModuleCache、--fsModuleCache=false
在监听模式下,Vitest 会将所有转换后的文件缓存在内存中,从而加快重新运行的速度。但是,测试运行结束后,此缓存会被丢弃。启用此选项后,Vitest 会将转换后的模块持久化到文件系统中,以便在后续重新运行以及不同的 Vitest 进程之间重复使用。
工作区中的每个项目共享同一个缓存目录。默认情况下,该目录位于工作区根目录的 node_modules 中(因此在重新安装依赖项时会自然失效);使用 fsModuleCachePath 可以更改其位置。你可以运行 vitest --clearCache 来删除缓存。
浏览器支持
目前,此选项不会影响浏览器。
你可以通过使用 DEBUG=vitest:cache:fs 环境变量运行 vitest,来检查模块是否已被缓存:
shell
DEBUG=vitest:cache:fs vitest --fsModuleCacheTIP
缓存的位置是一个工作区范围内的统一目录。请参阅 fsModuleCachePath 以更改其位置。
已知问题
Vitest 会基于文件内容、文件 ID、Vite 的环境配置和覆盖率状态创建持久化文件哈希。Vitest 会尝试使用它所掌握的尽可能多的配置信息,但这些信息仍然不完整。目前,由于没有标准接口,无法跟踪插件选项。
如果你的插件依赖于文件内容或公开配置之外的内容(例如读取其他文件或文件夹),缓存可能会变得过时。为了解决这个问题,你可以定义一个缓存键生成器来指定动态选项,或选择不对该模块进行缓存:
js
import { defineConfig } from 'vitest/config'
export default defineConfig({
plugins: [
{
name: 'vitest-cache',
configureVitest({ defineCacheKeyGenerator }) {
defineCacheKeyGenerator(({ id, sourceCode }) => {
// 永远不要缓存此 ID
if (id.includes('do-not-cache')) {
return false
}
// 根据动态变量的值缓存此文件
if (sourceCode.includes('myDynamicVar')) {
return process.env.DYNAMIC_VAR_VALUE
}
})
}
}
],
test: {
fsModuleCache: true,
},
})如果你是插件作者,请考虑在插件中定义一个缓存键生成器,前提是该插件可以使用会影响转换结果的不同选项进行注册。
另一方面,如果你的插件不应影响缓存键,可以将 api.vitest.ignoreFsModuleCache 设置为 true 来选择退出:
js
import { defineConfig } from 'vitest/config'
export default defineConfig({
plugins: [
{
name: 'vitest-cache',
api: {
vitest: {
ignoreFsModuleCache: true,
},
},
},
],
test: {
fsModuleCache: true,
},
})请注意,即使插件选择退出模块缓存,你仍然可以定义缓存键生成器。
