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/`] }; })
四、额外验证步骤
- 执行测试前先构建 lib:
npm run build:lib,确保依赖的源码或编译产物存在 - 检查
packages/lib/package.json中的types字段,确认指向正确的类型文件(如"types": "./src/index.ts"或编译后的.d.ts文件)
内容的提问来源于stack exchange,提问作者mlhaufe
相关产品推荐
相关产品推荐

