TypeScript React Native monorepo中jest单元与组件测试配置报错求解
问题产生原因
- 模块解析逻辑差异:React Native运行构建时由Metro打包器处理
@packages/别名映射,能正确找到内部包路径;但jest使用独立的模块解析规则,默认没有配置对应的别名映射,导致导入内部包时返回undefined,访问属性就抛出TypeError - monorepo目录适配缺失:jest默认的
moduleDirectories配置仅识别根目录node_modules,不会自动扫描monorepo下的packages目录,也无法匹配跨包导入的路径 - Babel配置作用域不匹配:RN构建时会加载根目录全局Babel配置处理所有子包代码,但jest默认仅处理测试文件所在目录的代码,内部包的别名导入语法没有被正确转换就直接执行
- 导出导入语法不兼容:如果Metrics模块混用ESM默认导出、命名导出规则,jest的CommonJS模块转换逻辑没有适配对应规则,也会导致导入后的值为
undefined
修复步骤
- 配置jest别名映射,在jest配置文件(通常是根目录
jest.config.js或者子包内的jest配置)中添加以下字段:
module.exports = { // 保留原有配置内容,新增以下配置 moduleNameMapper: { '^@packages/(.*)$': '<rootDir>/packages/$1', // 存在其他自定义别名可以按相同格式补充 }, moduleDirectories: ['node_modules', '<rootDir>/packages'], // 确保内部包的TS/TSX代码会被jest转换 transformIgnorePatterns: [ 'node_modules/(?!(react-native|@packages)/)', ] }
如果jest配置放在子包目录下,需要将
<rootDir>替换为对应相对路径,例如'<rootDir>/../packages/$1'
- 调整Babel全局作用域,在根目录
babel.config.json中添加babelrcRoots配置,确保所有子包代码都会被全局Babel规则处理:
{ // 保留原有Babel配置内容,新增以下字段 "babelrcRoots": [".", "./packages/*"] }
- 建议删除子包内单独的
.babelrc配置,统一收敛到根目录管理,避免配置冲突
- 同步tsconfig路径映射,确保
compilerOptions.paths中的别名规则和jest、Babel的配置完全一致:
{ "compilerOptions": { "baseUrl": ".", "paths": { "@packages/*": ["packages/*"] } } }
- 统一模块导出导入语法,检查Metrics模块的导出规则和导入语法是否匹配:
// 对应export default Metrics的导出规则 import Metrics from '@packages/common/src/Metrics' // 对应export const Metrics = {}的导出规则 import { Metrics } from '@packages/common/src/Metrics'
- 如果项目使用ESM规范,可在jest配置中添加
extensionsToTreatAsEsm: ['.ts', '.tsx']适配ES模块规则
内容的提问来源于stack exchange,提问作者TheWirv
相关产品推荐
相关产品推荐

