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

使用@swc/jest与TypeScript时Jest无法运行测试的问题排查

解决Jest运行时ERR_REQUIRE_ESM错误问题

问题根源

你遇到的错误是因为cliui(CommonJS模块)尝试require()了wrap-ansi的ES模块版本,而Jest默认运行在CommonJS环境下,无法直接加载ES模块。删除yarn.lock和node_modules后能正常运行,是因为首次安装时碰巧拉取了cliui和wrap-ansi的兼容版本组合;修改依赖后版本冲突,问题复现。

解决方案

1. 锁定兼容的依赖版本

通过yarn resolutions或npm overrides强制锁定cliui和wrap-ansi到兼容版本(cliui@7.x依赖CJS版本的wrap-ansi@7.x):

Yarn 用户:在package.json中添加

"resolutions": {
  "cliui": "^7.0.4",
  "wrap-ansi": "^7.0.0"
}

NPM 用户:在package.json中添加

"overrides": {
  "cliui": "^7.0.4",
  "wrap-ansi": "^7.0.0"
}

添加后重新执行yarn install或npm install,确保依赖版本被锁定。

2. 调整Jest与SWC的配置适配

因为你的TypeScript配置中module设为ESNext,但Jest需要CommonJS格式的代码,需确保SWC将代码转换为CommonJS:

修改Jest配置

module.exports = {
  // ...其他原有配置
  transform: {
    '^.+\\.(t|j)sx?$': ['@swc/jest', {
      jsc: {
        module: { type: 'commonjs' }
      }
    }],
  },
  // 告诉Jest将.ts/.tsx文件视为ES模块处理
  extensionsToTreatAsEsm: ['.ts', '.tsx'],
  // 映射ES模块的导入路径(移除.js后缀)
  moduleNameMapper: {
    '^(\\.{1,2}/.*)\\.js$': '$1',
  },
}

3. 检查package.json的type字段

如果你的package.json中存在"type": "module",Jest会以ES模块模式运行,可能加剧模块格式冲突。若无需全局启用ES模块,建议移除该字段;若必须保留,需额外配置Jest的ESM支持(比如添加--experimental-vm-modules参数),但优先推荐上述方案。

验证

修改配置后,执行jest测试,同时在GitHub Actions中确保使用相同的依赖锁定文件(提交yarn.lock或package-lock.json),避免CI环境中拉取不一致的依赖版本。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 01:39:51