Jest运行TypeScript测试时兼容含ES模块import的自动生成JS文件的配置方案
Jest运行TypeScript测试时兼容含ES模块import的自动生成JS文件的配置方案
我完全懂你现在的困扰——那个自动生成的JS文件用了ES模块的import语法,可Jest跑测试的时候直接报语法错误,还没法修改生成文件本身。别慌,咱们调整几个配置项就能解决这个问题,下面一步步来:
1. 优化jest.config.js配置
核心思路是让Jest把自动生成的JS文件当作ES模块处理,并且让ts-jest负责转换它。修改后的配置如下:
/** @type {import('ts-jest').JestConfigWithTsJest} **/ module.exports = { preset: 'ts-jest/presets/default-esm', // 保留ES模块预设 testEnvironment: "node", transform: { "^.+\\.tsx?$": ["ts-jest", { useESM: true }], // 新增:让ts-jest也处理生成的ES模块JS文件 "^.+\\.js$": ["ts-jest", { useESM: true }], }, // 新增:把自动生成的.js文件标记为ES模块 extensionsToTreatAsEsm: ['.ts', '.js'], moduleNameMapper: { '^(\\.{1,2}/.*)\\.js$': '$1', // 解开注释,处理JS文件的导入路径 }, // 关键:不要忽略自动生成文件的转换,确保Jest会处理它 transformIgnorePatterns: [ 'node_modules/(?!(your-other-esm-deps-if-any)/)', // 如果有其他ES模块依赖,也可以加在这里 '!src/declarations/', ], moduleFileExtensions: ['ts', 'js', 'mjs', 'mts'], // 明确支持的文件扩展名 };
2. 调整tsconfig.json让TypeScript识别生成文件
把自动生成的JS目录加入TypeScript的编译范围,避免测试文件导入时出现类型错误:
{ "compilerOptions": { "target": "es6", "lib": ["ES2018", "DOM"], "allowJs": true, "jsx": "react", "moduleResolution": "nodenext", "module": "nodenext", "skipLibCheck": true, "esModuleInterop": true, // 新增:提升ES模块与CommonJS的兼容性 }, "include": ["src/**/*.ts", "./src/custom.d.ts", "src/declarations/**/*.js"], // 加入生成的JS文件 "exclude": ["node_modules"] }
3. 可选:确认package.json的模块类型
如果你的项目本身是ES模块优先,建议在package.json里加上:
"type": "module"
这会让Node.js默认把.js文件当作ES模块,和你生成文件的语法风格保持一致,也能减少Jest的识别冲突。
为什么这些修改能解决问题?
- 给
transform加上.js的处理规则,让ts-jest把生成的ES模块JS文件转成Jest能理解的格式 extensionsToTreatAsEsm标记.js为ES模块,避免Jest把它当作CommonJS处理transformIgnorePatterns排除生成目录,防止Jest跳过对它的转换- TypeScript配置里包含生成文件,确保测试代码导入时不会出现类型报错
现在再运行npx jest test/test.ts,应该就能正常执行测试,不会再报SyntaxError: Cannot use import statement outside a module的错误了。
备注:内容来源于stack exchange,提问作者porton
相关产品推荐
相关产品推荐

