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

Monorepo中跨依赖包的ts-jest配置异常问题求助

Monorepo中ts-jest跨包依赖同名目录解析问题解决方法

问题核心

你的问题本质是ts-jest默认使用测试文件所在包的tsconfig转译所有依赖代码,包括跨包引入的文件。当packageB的测试导入packageA的代码时,packageA里的import 'utils/foo'会被按packageB的tsconfig规则解析,错误指向packageB的utils目录,而不是packageA自己的。这和esbuild/tsc的行为不同——后两者会根据每个文件所属包的tsconfig处理模块解析。

另外你观察到jest解析器没收到utils/foo的请求,确实是因为ts-jest在转译阶段就自行处理了模块解析,没有把这一步交给jest的原生解析器。

解决方案

核心思路是让ts-jest根据被转译文件的所属包,动态加载对应的tsconfig,具体配置如下:

1. 根目录jest.config.js配置

在Monorepo根目录的jest.config.js中,修改ts-jest的transform配置,让它自动识别当前处理文件所属包的tsconfig:

module.exports = {
  transform: {
    '^.+\\.tsx?$': [
      'ts-jest',
      {
        // 动态获取当前文件所属包的tsconfig路径
        tsconfig: (fileName) => {
          const path = require('path');
          // 找到当前文件所在包的package.json目录
          const pkgRoot = path.dirname(require.resolve(path.join(path.dirname(fileName), 'package.json')));
          return path.join(pkgRoot, 'tsconfig.json');
        },
      },
    ],
  },
  // 保留你已配置的moduleNameMapper等其他基础配置
};

2. 确保每个包的tsconfig配置正确

每个包的tsconfig.json里必须设置baseUrl: ".",这样import 'utils/xxx'才能解析到当前包的utils目录。比如packageA的tsconfig:

{
  "compilerOptions": {
    "baseUrl": ".",
    "module": "ESNext",
    "target": "ESNext",
    "moduleResolution": "NodeNext"
    // 其他编译配置
  }
}

3. 验证配置生效

修改packageA的tsconfig,加入一个语法错误(比如写错compilerOptions字段),重新运行packageB的测试。如果测试报错,说明ts-jest已经正确读取了packageA的tsconfig,配置生效。

额外注意事项

  • 确保Monorepo的包管理工具(Yarn/NPM Workspaces)已经正确链接了跨包依赖,比如packageB的package.json中已将packageA列为依赖或开发依赖。
  • 若每个包有独立的jest配置,建议让它们继承根目录的配置,避免重复设置。

内容的提问来源于stack exchange,提问作者Jeremy Gordon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 18:24:52