NestJS集成测试遇SyntaxError:@nestjs/axios无法使用import语句
NestJS集成测试遇
SyntaxError: Cannot use import statement outside a module问题解决 问题概述
运行NestJS集成测试时触发错误:SyntaxError: Cannot use import statement outside a module,错误指向@nestjs/axios库使用ESM而非CommonJS规范。尝试通过yarn node --experimental-vm-modules $(yarn bin jest)启动测试未解决问题,且疑惑为何node_modules中的嵌套依赖文件会被Jest匹配(报错路径:node_modules/@bank/auth/node_modules/@nestjs/axios/node_modules/axios/index.js:1)。
当前Jest配置:
"jest": { "moduleFileExtensions": [ "js", "json", "ts" ], "rootDir": "", "preset": "ts-jest", "testRegex": ".spec.ts$", "transform": { "^.+\\.(t|j)s$": "ts-jest" }, "coverageDirectory": "./coverage", "testEnvironment": "node", "globalSetup": "<rootDir>/tests/jest.setup.ts", "globalTeardown": "<rootDir>/tests/jest.teardown.ts" }
依赖版本:
"@nestjs/axios": "^1.0.1", "@types/jest": "^24.0.18", "jest": "^26.0.0", "ts-jest": "^26.5.5", "typescript": "^4.2.3"
原因分析
- 嵌套依赖版本冲突:项目根依赖的
@nestjs/axios与内部依赖@bank/auth嵌套安装的@nestjs/axios版本不一致,嵌套版本依赖的axios为ESM格式,而Jest默认不转译node_modules文件,导致无法识别ESM的import语法。 - 旧版Jest对ESM支持有限:你使用的Jest v26版本对ESM的兼容性较差,
--experimental-vm-modules参数在该版本下无法有效处理嵌套ESM依赖。
解决方案
1. 扁平化依赖(优先推荐)
执行依赖去重命令,强制所有依赖共享根目录的@nestjs/axios版本,消除嵌套安装:
yarn dedupe @nestjs/axios
2. 调整Jest转译规则
修改Jest配置中的transformIgnorePatterns,让ts-jest转译嵌套的ESM格式axios文件:
"jest": { // 保留原有配置 "transformIgnorePatterns": [ "node_modules/(?!@bank/auth/node_modules/@nestjs/axios/node_modules/axios)" ] }
3. 升级Jest相关依赖
将jest、ts-jest、@types/jest升级到较新版本(如v29),新版本对ESM支持更完善:
"@types/jest": "^29.5.0", "jest": "^29.5.0", "ts-jest": "^29.1.0"
升级后可配合ts-jest的ESM模式,在Jest配置中添加:
"jest": { "preset": "ts-jest/presets/js-with-ts", "extensionsToTreatAsEsm": [".ts"] }
4. 映射axios到CommonJS版本
在Jest配置中添加moduleNameMapper,将ESM格式的axios强制映射到CommonJS版本:
"jest": { // 保留原有配置 "moduleNameMapper": { "^axios$": "axios/dist/node/axios.cjs" } }
内容的提问来源于stack exchange,提问作者Duarte
相关产品推荐
相关产品推荐

