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

NextJS+Vite项目中jsx配置自动变更致测试失败的解决方法

解决Next.js中tsconfig.jsx自动重置导致的测试错误

你遇到的核心问题:在Next.js项目里,为解决测试时的ReferenceError: React is not defined错误,将tsconfig.json的"jsx"设为"react-jsx",但执行npm run dev后该配置会被自动改回"preserve",导致测试再次失败。

方案1:为测试单独配置tsconfig(推荐)

Next.js在开发/构建阶段会自动管理jsx配置,所以不要修改主tsconfig.json的jsx值,而是给测试环境单独创建配置文件:

  1. 创建tsconfig.test.json文件
    在项目根目录新建该文件,继承主配置并覆盖jsx选项:
{
  "extends": "./tsconfig.json",
  "compilerOptions": {
    "jsx": "react-jsx"
  },
  "include": ["src/**/*.test.ts", "src/**/*.test.tsx"]
}
  1. 修改测试命令
    在package.json的scripts中,指定测试时使用这个配置文件:
{
  "scripts": {
    "test": "vitest --tsconfig tsconfig.test.json"
  }
}
  1. 修复测试代码的错误写法
    你当前测试中直接调用render(Home())不符合React组件渲染规范,应该用JSX语法传入组件:
/**
 * @jest-environment jsdom
 */

import { render, screen } from "@testing-library/react";
import { test, expect } from "vitest";
import Home from "../app/page";

test("Home page", () => {
  render(<Home />);
  expect(screen.getByText("Home of Coach-Next")).toBeTruthy();
});

方案2:手动在测试文件中导入React(临时方案)

如果不想额外创建配置文件,可以在每个测试文件顶部手动导入React:

/**
 * @jest-environment jsdom
 */

import React from "react";
import { render, screen } from "@testing-library/react";
import { test, expect } from "vitest";
import Home from "../app/page";

test("Home page", () => {
  render(<Home />);
  expect(screen.getByText("Home of Coach-Next")).toBeTruthy();
});

原因说明

Next.js的App Router模式默认使用jsx: "preserve",因为框架会自行处理JSX转译逻辑(比如自动适配Next.js专属的JSX运行时),所以主配置的jsx值会被自动覆盖。而测试环境需要react-jsx让TypeScript自动注入React导入,因此单独为测试配置是最稳妥的解决方案。

内容的提问来源于stack exchange,提问作者Sandra Schlichting

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 17:43:29