如何在Vitest中正确排除node_modules?解决模块导入报错
解决Vitest单元测试中"Cannot use import statement outside a module"报错
问题本质
你碰到的报错和exclude配置无关——exclude的作用是指定哪些文件不被当作测试文件,而非控制node_modules模块的转译逻辑。报错核心原因是access包使用了ES模块语法,但Vitest默认不会转译node_modules内的内容,导致Node.js将其当作CommonJS模块处理,触发语法错误。
解决方案
方案1:内联处理目标包
在Vitest配置中添加deps.inline,让Vitest对access包进行内联转译:
import { defineConfig, configDefaults } from 'vitest/config' import vue from '@vitejs/plugin-vue' export default defineConfig({ plugins: [vue()], test: { environment: 'happy-dom', globals: true, mockReset: true, restoreMocks: true, clearMocks: true, exclude: [ ...configDefaults.exclude, '<rootDir>/node_modules/**' ], // 新增内联配置 deps: { inline: ['access'] } }, })
方案2:强制转译目标包
如果方案1无效,可通过transformInclude强制指定Vitest转译access包:
import { defineConfig, configDefaults } from 'vitest/config' import vue from '@vitejs/plugin-vue' export default defineConfig({ plugins: [vue()], test: { environment: 'happy-dom', globals: true, mockReset: true, restoreMocks: true, clearMocks: true, exclude: [ ...configDefaults.exclude, '<rootDir>/node_modules/**' ], // 新增转译规则 transformInclude: [ /node_modules\/access/ ] }, })
额外检查项
- 查看
access包的package.json:若它是ES模块,需确保包含"type": "module";若为CommonJS模块,应避免代码中使用ES import语法。 - 确认测试文件中的导入路径无拼写错误。
内容的提问来源于stack exchange,提问作者Ricardo de Vries
相关产品推荐
相关产品推荐

