使用@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
相关产品推荐
相关产品推荐

