React-Native报Cannot use import statement outside a module错误求助

问题根因
这个报错是Jest测试环境解析模块时,遇到了未被转译的ES Module格式import语句,本质是做依赖mock后,模块转译规则、mock文件格式或者环境配置不匹配导致的,按下面步骤逐一排查修复即可:
排查修复步骤
调整Jest转译白名单配置
Jest默认不会转译node_modules下的依赖,如果mock后仍有Firebase、GoogleSignin的子依赖被直接引入,就会触发该错误。打开项目下的jest.config.js文件,修改transformIgnorePatterns配置:transformIgnorePatterns: [ "node_modules/(?!(@react-native|react-native|@react-native-firebase|@react-native-google-signin)/)" ]把所有React Native、Firebase、GoogleSignin相关的作用域包加入转译白名单,让Babel处理这些包内的ES Module语法。
检查自定义mock文件的格式
如果手写了Firebase、GoogleSignin的mock文件,先确认文件语法:- 要么直接用CommonJS规范写mock,通过
module.exports导出mock内容,不需要转译就能直接被Jest识别 - 如果要用
import/export的ES Module语法写mock,需要把mock文件所在目录加入Jest的转译范围,不要被转译忽略规则跳过
- 要么直接用CommonJS规范写mock,通过
核对package.json的模块类型配置
打开项目根目录的package.json,如果存在"type": "module"字段直接删除。React Native的Jest预设默认走CommonJS解析逻辑,手动声明module类型会打乱默认解析规则,所有非.cjs后缀的文件都会被当成ES Module解析,极易触发该语法错误。校验测试环境配置
确认jest.config.js内的testEnvironment配置为react-native(使用RN官方Jest预设时默认生效)或者node,不要随意配置为其他不兼容的环境类型,避免模块解析逻辑异常。
生效验证
所有配置修改完成后,先执行npx jest --clearCache清除Jest历史缓存,再重新运行测试即可,旧缓存会导致新配置不生效。
内容的提问来源于stack exchange,提问作者Baha Th

