Jest导入ESModule报错:Cannot use import statement outside a module
解决Jest无法处理ESModule依赖(file-type)的问题
方案1:配置Jest转换规则
Jest默认忽略node_modules内文件的转换,而file-type是纯ESModule,需将其加入转换白名单并通过Babel处理:
- 安装依赖:
npm install --save-dev @babel/core @babel/preset-env @babel/preset-typescript babel-jest
- 修改
jest.config.js:
module.exports = { preset: 'ts-jest', testEnvironment: 'node', transform: { '^.+\\.(ts|tsx)$': 'ts-jest', '^.+\\.js$': 'babel-jest', }, transformIgnorePatterns: [ '/node_modules/(?!file-type)/', ], };
- 项目根目录创建
.babelrc:
{ "presets": [ ["@babel/preset-env", { "targets": { "node": "current" } }], "@babel/preset-typescript" ] }
方案2:改用ESModule兼容的Jest环境
若项目本身采用ESModule配置,可切换至支持ESM的Jest环境:
- 安装依赖:
npm install --save-dev jest-environment-node-esm
- 修改
jest.config.js:
module.exports = { preset: 'ts-jest/presets/default-esm', testEnvironment: 'node-esm', extensionsToTreatAsEsm: ['.ts'], moduleNameMapper: { '^(\\.{1,2}/.*)\\.js$': '$1', }, };
- 确保
package.json包含:
{ "type": "module" }
方案3:简化版TS-Jest配置
无需额外安装Babel,直接调整Jest与TS-Jest的ESM兼容设置:
在package.json中添加Jest配置:
{ "jest": { "preset": "ts-jest", "testEnvironment": "node", "transformIgnorePatterns": ["node_modules/(?!file-type)"], "globals": { "ts-jest": { "useESM": true } }, "moduleNameMapper": { "^(\\.{1,2}/.*)\\.js$": "$1" } } }
验证
修改配置后重新运行测试:
npm test
若仍有问题,检查tsconfig.json的module字段,确保设置为CommonJS或ESNext,与Jest配置兼容。
内容的提问来源于stack exchange,提问作者Henrique Ramos
相关产品推荐
相关产品推荐

