You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

文件夹名称为何影响npm test、Jest及Babel?Jest测试遇import语法错误

解决Jest测试中SyntaxError: Unexpected token import的问题

我之前也碰到过完全一样的情况:普通jest命令跑测试失败,但加上--coverage参数就能正常执行。这背后的核心原因和Jest的代码转换逻辑、Babel配置的触发条件有关,下面给你一步步拆解解决方案:

1. 问题根源解析

Jest在生成覆盖率报告时,会强制对所有匹配的代码进行转换(因为需要插桩收集覆盖率数据),这会自动触发Babel处理ES6语法;但普通测试模式下,如果你的Jest配置没有明确指定转换规则,或者Babel的test环境配置未正确生效,Node环境就无法解析import这类ES6模块语法,从而抛出SyntaxError。

2. 修复Babel的test环境配置

首先检查你的.babelrc(或babel.config.js),确保针对test环境配置了模块转换规则。Next.js的预设默认使用ES模块,但Jest运行在Node环境下需要CommonJS模块,所以要在test环境中添加转换插件:

{
  "presets": ["next/babel"],
  "env": {
    "test": {
      "plugins": ["@babel/plugin-transform-modules-commonjs"]
    }
  }
}

这个配置会让Babel在test环境下自动把ES模块转换为CommonJS,让Jest能正确解析import语法。

3. 强制Jest启用babel-jest转换

接下来要确保Jest在普通测试模式下也会调用Babel处理代码,需要在Jest配置里明确指定转换规则:

方式1:使用jest.config.js文件

module.exports = {
  transform: {
    '^.+\\.(js|jsx|ts|tsx)$': 'babel-jest',
  },
  // 其他Jest配置(比如testMatch、moduleNameMapper等)
}

方式2:在package.json中配置

{
  "jest": {
    "transform": {
      "^.+\\.(js|jsx|ts|tsx)$": "babel-jest"
    }
  }
}

这一步是关键,确保Jest不会直接用Node解析你的源码,而是通过Babel转换后再执行。

4. 清除Jest缓存

有时候Jest的缓存会导致配置变更不生效,运行测试时可以先加--no-cache参数:

npm test -- --no-cache

5. 验证并更新脚本

修改完配置后,先运行NODE_ENV=test jest --no-cache验证是否正常执行。如果没问题,可以更新package.json里的脚本:

"scripts": {
  "test": "NODE_ENV=test jest --no-cache",
  "test:coverage": "NODE_ENV=test jest --coverage"
}

额外排查点

  • 确认已安装必要依赖:babel-jest、@babel/plugin-transform-modules-commonjs(Babel 7+版本)。
  • 检查transformIgnorePatterns配置,不要把自己的源码目录加入忽略列表,否则Jest会跳过这些文件的转换。

内容的提问来源于stack exchange,提问作者Dave Stein

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 09:16:53