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

Monorepo中ts-jest无法找到@mlhaufe/graphics/adapters模块问题

问题分析与解决方案

一、Jest Projects 配置逻辑澄清

当 Jest 使用 projects 数组时,全局配置不会自动完全继承给每个子项目:

  • 仅少数全局配置(如 verbose、reporters)会与子项目配置合并
  • 核心配置项(如 moduleNameMapper、transform、modulePaths)需在每个子项目中显式声明,或通过工具手动合并全局与子项目配置

这就是你误以为全局设置会生效,但实际子项目测试出错的核心原因。

二、模块找不到问题的具体修复步骤

1. 修正 Resolver 路径错误

你的 Jest 配置中 rootDir 设为 ./packages,但 resolver: '<rootDir>/mjs-resolver.ts' 会指向 packages/mjs-resolver.ts,而实际该文件在项目根目录。需改为绝对路径:

// 在 jest.config.mjs 的子项目配置中替换 resolver 行
resolver: path.resolve(__dirname, 'mjs-resolver.ts'),

2. 确保模块路径映射正确

验证 pathsToModuleNameMapper 生成的映射是否符合预期,可临时添加打印查看:

const mapper = pathsToModuleNameMapper(compilerOptions.paths, {
    prefix: '<rootDir>',
    useESM: true
});
console.log(mapper);
// 正确输出应为:{ '@mlhaufe/graphics/(.*)': '<rootDir>/lib/src/$1' }

若映射错误,检查 prefix 参数与 rootDir 的一致性——当前 rootDir 是 ./packages,映射后的路径应指向 packages/lib/src/xxx,与 TS 配置完全匹配。

3. 让 ts-jest 识别子项目的 TS 配置

TypeScript 通过 references 能正确解析类型,但 ts-jest 默认不会自动处理项目引用,需在子项目的 transform 配置中指定对应 tsconfig:

transform: {
    '^.+\\.mts$': ['ts-jest', { 
        useESM: true,
        tsconfig: path.resolve(__dirname, `packages/${name}/tsconfig.json`)
    }]
},

4. 修正 ModulePaths 路径

modulePaths 需使用绝对路径,避免 Jest 路径解析歧义:

modulePaths: [path.resolve(__dirname, compilerOptions.baseUrl)],

5. 限制测试根目录范围

将子项目的 roots 设为当前子项目目录,避免 Jest 跨项目查找测试文件导致的路径混乱:

roots: [`<rootDir>/packages/${name}`],

三、修正后的关键配置片段

// jest.config.mjs 中 projects 部分的完整修正
projects: packageNames.map((name) => {
    const tsconfigPath = path.resolve(__dirname, `packages/${name}/tsconfig.json`);
    return {
        displayName: name,
        transform: {
            '^.+\\.mts$': ['ts-jest', { 
                useESM: true,
                tsconfig: tsconfigPath
            }]
        },
        moduleFileExtensions: ['js', 'mjs', 'mts', 'ts'], // 补充源文件扩展名
        roots: [`<rootDir>/packages/${name}`],
        modulePaths: [path.resolve(__dirname, compilerOptions.baseUrl)],
        resolver: path.resolve(__dirname, 'mjs-resolver.ts'),
        moduleNameMapper: pathsToModuleNameMapper(compilerOptions.paths, {
            prefix: '<rootDir>',
            useESM: true
        }),
        testMatch: [`<rootDir>/packages/${name}/**/*.test.mts`],
        testPathIgnorePatterns: [`<rootDir>/packages/${name}/dist/`]
    };
})

四、额外验证步骤

  1. 执行测试前先构建 lib:npm run build:lib,确保依赖的源码或编译产物存在
  2. 检查 packages/lib/package.json 中的 types 字段,确认指向正确的类型文件(如 "types": "./src/index.ts" 或编译后的 .d.ts 文件)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 16:05:20