NextJS13集成vitest遇导入解析错误,寻求解决方法
问题:NextJS13集成Vitest时导入解析失败
在NextJS13项目中集成Vitest时,运行简单测试遇到导入解析失败的问题,提示找不到模块 src/common/components/DataTable。尝试调整vitest.config.ts的dir、include选项,以及检查tsconfig.json,都没能解决问题。
项目目录结构
src/ └── common/ └── components/ └── DataTable/ ├── DataTable.tsx ├── DataTable.test.tsx └── index.tsx
相关文件内容
vitest.config.ts
/// <reference types="vitest" /> import { defineConfig } from 'vitest/config' import react from '@vitejs/plugin-react' // https://vitejs.dev/config/ export default defineConfig({ plugins: [react()], test: { globals: true, environment: 'jsdom', include: ['src/**/*.{test,spec}.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'], setupFiles: 'setupTests.ts', // dir: './src' // includeSource: ['src/**/*.{js,ts,tsx}'], }, });
tsconfig.json
{ "compilerOptions": { "target": "ES2017", "lib": ["es6", "dom", "dom.iterable", "esnext"], "allowJs": true, "skipLibCheck": true, "strict": false, "forceConsistentCasingInFileNames": true, "noEmit": true, "esModuleInterop": true, "module": "ESNEXT", "moduleResolution": "node", "resolveJsonModule": true, "isolatedModules": true, "jsx": "preserve", "baseUrl": ".", "incremental": true, // "paths": { // "src": ["./src/*"] // } }, "exclude": ["node_modules"], "include": ["vitest.config.ts","**/*.ts", "**/*.tsx", "next-env.d.ts", "next.config.js"] }
DataTable.test.tsx(src/common/components/DataTable/DataTable.test.tsx)
// components import DataTable from 'src/common/components/DataTable'; // dependencies import {describe, it} from 'vitest' import {screen, render} from '@testing-library/react' describe('DataTable test', () => { it('render the app', () => { // arrange render(<DataTable />) // act const assetText = screen.getByText("asset") // assert // expect(assetText).toBeInTheDocument() }) })
DataTable.tsx(src/common/components/DataTable/DataTable.tsx)
export const DataTable = () => { return ( <div> <h1>assets</h1> </div> ); };
index.tsx(src/common/components/DataTable/index.tsx)
import { DataTable } from 'src/common/components/DataTable/DataTable'; export default DataTable;
解决方案
1. 配置TypeScript路径映射
在tsconfig.json的compilerOptions中启用paths,让TypeScript识别src/开头的导入路径:
"paths": { "src/*": ["./src/*"] }
2. 让Vitest支持路径映射
Vitest本身不会自动读取tsconfig的paths配置,需要安装vite-tsconfig-paths插件来处理:
npm install vite-tsconfig-paths --save-dev
然后修改vitest.config.ts,引入并使用该插件:
/// <reference types="vitest" /> import { defineConfig } from 'vitest/config' import react from '@vitejs/plugin-react' import tsconfigPaths from 'vite-tsconfig-paths' export default defineConfig({ plugins: [react(), tsconfigPaths()], test: { globals: true, environment: 'jsdom', include: ['src/**/*.{test,spec}.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'], setupFiles: 'setupTests.ts', }, });
3. 修正测试用例中的文本匹配问题
组件中渲染的是assets,但测试用例中查找的是asset,会导致后续断言失败,建议修改测试代码:
const assetText = screen.getByText("assets")
内容的提问来源于stack exchange,提问作者medev21
相关产品推荐
相关产品推荐

