Jest运行文件夹测试时报错“Cannot use import statement outside a module”,但单独测试文件正常
Jest运行文件夹测试时报错“Cannot use import statement outside a module”,但单独测试文件正常
嗨,我来帮你分析下这个问题——这种“单独测文件正常,测文件夹就崩”的情况,大概率是全局Jest和本地项目环境不兼容导致的,再加上node-fetch本身是ES模块,触发了Jest的转译盲区。咱们一步步来解决:
第一步:卸载全局Jest,只用本地项目依赖
全局安装的Jest不会自动读取你项目里的package.json(比如"type": "module")和.babelrc配置,这就导致它处理node-fetch这类ES模块依赖时直接报错。先把全局Jest卸掉:
npm uninstall -g jest
之后所有测试命令都会用你项目node_modules里的本地Jest,它会优先加载项目内的配置,适配你的ES模块环境。
第二步:创建专门的Jest配置文件
你之前没有单独的Jest配置,现在新建一个jest.config.js文件在项目根目录,内容如下:
export default { // 指定用babel-jest转译所有JS文件 transform: { "^.+\\.js$": "babel-jest" }, // 让node-fetch跳过node_modules的默认忽略规则,被Babel转译 transformIgnorePatterns: [ "/node_modules/(?!node-fetch)" ], // 识别JS文件作为模块 moduleFileExtensions: ["js"], // 指定测试环境为Node.js(符合你的后端项目场景) testEnvironment: "node" };
这个配置会明确告诉Jest:所有JS文件都用Babel转译,node-fetch例外要被转译,避免它的ES模块语法被Jest当成无效代码。
第三步:验证脚本和依赖
检查你package.json里的test脚本,现在可以保留原来的:
"test": "jest --no-cache"
如果担心npm没找到本地Jest,也可以改成npx jest --no-cache,强制调用本地版本。
另外,你的.babelrc配置是没问题的:@babel/preset-env针对当前Node版本,@babel/plugin-transform-modules-commonjs把ES模块转成Jest能识别的CommonJS,这个不用改。
额外排查点
- 确认node-fetch版本:如果你用的是v3+,它本身就是纯ES模块,所以必须通过
transformIgnorePatterns让Jest转译它,这一步不能少。 - 测试其他无node-fetch的文件时出错,是因为Jest扫描整个文件夹时,会加载所有依赖链(比如某个文件间接引入了node-fetch),而全局Jest没处理好这个转译,换成本地Jest+正确配置后应该就解决了。
现在你再试试运行npm run test或者jest src/utils/,应该就能正常执行所有测试了!
备注:内容来源于stack exchange,提问作者Shograti
相关产品推荐
相关产品推荐

