配置create-react-app ejected项目测试时绝对路径报错:无法找到模块
解决Create React App(Eject后)+ TypeScript中Jest无法识别绝对路径导入的问题
我之前在 eject 后的 CRA + TS 项目里也碰到过一模一样的问题——调试时绝对路径导入好好的,一跑 Jest 测试就报「Cannot find module」,折腾了一会儿才搞定,分享下我的解决方案:
核心原因
TypeScript 编译器会读取 tsconfig.json 里的 baseUrl 来解析绝对路径,但 Jest 作为独立的测试运行器,不会自动继承 tsconfig 的路径配置,所以得单独给 Jest 配置路径映射。
步骤1:确认 tsconfig 配置正确
先确保你的 tsconfig.json 里的 baseUrl 确实指向 ./src,比如:
{ "compilerOptions": { "baseUrl": "./src", // 其他编译配置(比如 target、lib 等)... }, // 其他配置... }
步骤2:配置 Jest 路径映射
Eject 后,项目根目录会生成 jest.config.js(或者你也可以在 package.json 的 jest 字段里配置),这里提供两种方式:
方式一:修改 jest.config.js
在配置文件中添加 modulePaths 和(可选)moduleNameMapper:
module.exports = { // 保留原有的 Jest 配置(比如 setupFilesAfterEnv、testEnvironment 等) modulePaths: ['<rootDir>/src'], // 告诉 Jest 把 src 目录当作模块根目录 // 如果你的绝对路径有特定前缀(比如你用的 `framework/`),可以用更精确的映射: moduleNameMapper: { '^framework/(.*)$': '<rootDir>/src/framework/$1' }, // 确保 Jest 能处理 TypeScript 文件 transform: { '^.+\\.(ts|tsx)$': 'ts-jest', }, testMatch: [ '**/__tests__/**/*.+(ts|tsx|js)', '**/?(*.)+(spec|test).+(ts|tsx|js)', ], };
方式二:在 package.json 中配置 Jest
如果你的项目把 Jest 配置写在 package.json 里,就修改 jest 字段:
"jest": { // 原有配置... "modulePaths": ["<rootDir>/src"], "moduleNameMapper": { "^framework/(.*)$": "<rootDir>/src/framework/$1" }, "transform": { "^.+\\.(ts|tsx)$": "ts-jest" } }
步骤3:安装必要依赖
Eject 后的项目可能需要手动安装 ts-jest 来让 Jest 处理 TypeScript:
npm install --save-dev ts-jest @types/jest
如果你用 Enzyme 做测试,还要确保适配器和类型依赖安装正确(以 React 17 为例):
npm install --save-dev enzyme enzyme-adapter-react-17 @types/enzyme @types/enzyme-adapter-react-17
然后在 src/setupTests.ts 里配置 Enzyme:
import { configure } from 'enzyme'; import Adapter from 'enzyme-adapter-react-17'; configure({ adapter: new Adapter() });
验证修复
运行你的测试命令(比如 npm test),应该就能正常识别绝对路径导入了!
内容的提问来源于stack exchange,提问作者TheSoul
相关产品推荐
相关产品推荐

