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

ts-jest配置:将@字符映射到/src目录的问题求助

解决Jest中TypeScript路径别名的映射问题

这个问题我之前也踩过坑!核心原因是你写的正则"^\@(.*)"把所有以@开头的模块都匹配了——包括像@babel/code-frame这样的第三方npm包,Jest自然会去src目录下找,结果肯定找不到。

官方推荐的最优方案:用ts-jest工具函数自动转换路径

ts-jest提供了pathsToModuleNameMapper函数,可以直接读取你tsconfig.json里的paths配置,自动转换成Jest能识别的moduleNameMapper规则。这样既能和TS配置保持完全一致,又不用手动维护正则,新增文件夹也不用改配置。

具体步骤:

  1. 在jest.config.js中导入工具函数和你的tsconfig.json配置
  2. 用工具函数生成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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:46:15