Monorepo中Jest+TypeScript无法识别根目录外依赖export关键字问题
Jest+TypeScript Monorepo 跨目录引用模块解析错误解决方案
问题根因
Jest 默认仅会对rootDir(即你配置的app1目录)下的代码执行转译逻辑,位于rootDir外的shared目录下的TS/ES6文件被默认排除在转译范围外,因此export等ES模块语法会被识别为非法token。
解决方案
仅需修改app1目录下的两份配置即可,无需在fe根目录新增配置,保留从app1目录启动测试的能力:
1. 修改 fe/app1/.jest.config.ts
调整如下配置项:
module.exports = { // 保留原有其他配置 rootDir: '.', // 明确rootDir为当前app1目录 // 将shared目录加入Jest的文件处理根路径 roots: ['<rootDir>/src', '<rootDir>/../shared'], transform: { '^.+\\.(jsx?|tsx?)$': 'ts-jest' }, // 解除对shared目录的转译忽略 transformIgnorePatterns: [ '/node_modules/', '!<rootDir>/../shared/' // ! 表示不匹配该路径,即不对shared目录做转译忽略 ], moduleNameMapper: { '^@/(.*)$': '<rootDir>/src/$1', '^@shared/(.*)$': '<rootDir>/../shared/$1', }, // 配置ts-jest允许处理rootDir外的文件 globals: { 'ts-jest': { tsconfig: '<rootDir>/tsconfig.json', isolatedModules: true } } }
2. 修改 fe/app1/tsconfig.json
调整路径别名和include范围:
{ "compilerOptions": { "target": "esnext", "module": "esnext", "moduleResolution": "node", "esModuleInterop": true, "paths": { "@/*": ["./src/*"], "@shared/*": ["../shared/*"] // 修正路径:相对tsconfig所在的app1目录,shared位于上级目录 } }, // 将shared目录加入TS编译范围,确保类型和语法解析正常 "include": ["src/**/*", "../shared/**/*", "**/*.spec.ts"] }
额外注意事项
你提供的测试代码存在两处语法笔误,修正后可避免额外报错:
descrube改为正确的describeexpect(someData).toBe('DUMMY'));多了一个右括号,改为expect(someData).toBe('DUMMY');
修改完成后直接在app1目录下执行测试命令即可正常运行。
内容的提问来源于stack exchange,提问作者eXception
相关产品推荐
相关产品推荐

