You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 23:50:23