Skip to content

fsModuleCache 5.0.0+

  • 类型: boolean
  • 默认值: false
  • 命令行终端: --fsModuleCache, --fsModuleCache=false

在 watch 模式下,Vitest 会将所有转换后的文件缓存在内存中,从而加快重新运行测试的速度。但测试运行结束后,这些缓存便会被丢弃。启用此选项后,Vitest 会将转换后的模块持久化到文件系统中,以便在后续重新运行测试时复用,甚至可以在不同的 Vitest 进程之间共享。

工作区中的所有项目共用一个缓存目录。默认情况下,该目录位于工作区根目录的 node_modules 中,因此重新安装依赖项时,缓存也会随之失效。你可以通过 fsModuleCachePath 更改缓存目录,也可以运行 vitest --clearCache 删除缓存。

浏览器支持

目前,此选项对 浏览器模式 无效。

如果要调试模块的缓存状态,可以设置 DEBUG=vitest:cache:fs 环境变量并运行 Vitest:

shell
DEBUG=vitest:cache:fs vitest --fsModuleCache

提示

整个工作区的缓存统一存放在同一个目录中。如果要更改该目录,请参阅 fsModuleCachePath

已知问题

Vitest 会根据文件内容、文件 ID、Vite 环境配置和覆盖率状态生成持久化的文件哈希。Vitest 会尽可能将已知的配置信息纳入计算,但这些信息仍不完整。目前,由于缺少统一的接口,Vitest 无法跟踪插件选项。

如果插件的转换结果依赖文件内容或公开配置之外的信息(例如读取其他文件或目录),缓存可能无法及时失效。为避免这种情况,可以定义 缓存键生成器,将动态选项加入缓存键,或者禁止缓存相应模块:

vitest.config.js
js
import { defineConfig } from 'vitest/config'

export default defineConfig({
  plugins: [
    {
      name: 'vitest-cache',
      configureVitest({ defineCacheKeyGenerator }) {
        defineCacheKeyGenerator(({ id, sourceCode }) => {
          // 不缓存包含此字符串的模块
          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,使其不参与缓存键的计算:

vitest.config.js
js
import { defineConfig } from 'vitest/config'

export default defineConfig({
  plugins: [
    {
      name: 'vitest-cache',
      api: {
        vitest: {
          ignoreFsModuleCache: true,
        },
      },
    },
  ],
  test: {
    fsModuleCache: true,
  },
})

注意,即使插件选择不参与模块缓存,仍然可以定义缓存键生成器。