ts-jest配置:将@字符映射到/src目录的问题求助
解决Jest中TypeScript路径别名的映射问题
这个问题我之前也踩过坑!核心原因是你写的正则"^\@(.*)"把所有以@开头的模块都匹配了——包括像@babel/code-frame这样的第三方npm包,Jest自然会去src目录下找,结果肯定找不到。
官方推荐的最优方案:用ts-jest工具函数自动转换路径
ts-jest提供了pathsToModuleNameMapper函数,可以直接读取你tsconfig.json里的paths配置,自动转换成Jest能识别的moduleNameMapper规则。这样既能和TS配置保持完全一致,又不用手动维护正则,新增文件夹也不用改配置。
具体步骤:
- 在
jest.config.js中导入工具函数和你的tsconfig.json配置 - 用工具函数生成
moduleNameMapper
代码示例:
const { pathsToModuleNameMapper } = require('ts-jest'); // 导入tsconfig的compilerOptions,注意路径要和你的项目结构匹配 const { compilerOptions } = require('./tsconfig.json'); module.exports = { preset: 'ts-jest', testEnvironment: 'node', roots: ['<rootDir>/src/'], modulePathIgnorePatterns: ['<rootDir>/dist/', '<rootDir>/build/'], testMatch: ['**/*.spec.ts'], // 关键:用pathsToModuleNameMapper转换路径,prefix要对应项目根目录 moduleNameMapper: pathsToModuleNameMapper(compilerOptions.paths, { prefix: '<rootDir>/' }) };
为什么这个方法有效?
- 工具函数会严格按照你
tsconfig.json里的paths规则生成映射,只会匹配你项目定义的别名(比如@xxx/yyy对应src/xxx/yyy,@project/*对应根目录) - 第三方的
@babel/*这类包不会被匹配,Jest会自动去node_modules里查找,不会出现错误映射
备选方案:手动写精准的正则
如果你不想用工具函数,可以调整正则,只匹配项目内部的@别名,排除第三方包:
module.exports = { // ...其他配置 moduleNameMapper: { // 单独处理@project的映射,对应根目录 "^@project/(.*)$": "<rootDir>/$1", // 匹配@xxx/yyy格式的项目内部别名,映射到src/xxx/yyy "^@([^/]+)/(.*)$": "<rootDir>/src/$1/$2", // 匹配@xxx格式的别名(比如导入@lib/index.ts可以简写为@lib) "^@([^/]+)$": "<rootDir>/src/$1" } };
这个正则通过[^/]+确保只匹配@后面跟着非斜杠的字符(也就是项目里的文件夹名),不会匹配@babel/code-frame这类第三方包的导入。
内容的提问来源于stack exchange,提问作者opensas
相关产品推荐
相关产品推荐

