TypeScript项目Jest测试导入.js文件报错,dev/start执行冲突求助
解决方案
问题根源
你遇到的是TypeScript ESM模块与Jest兼容性的问题:
- ESM规范要求导入必须带文件扩展名,所以生产环境(
start命令运行dist目录的编译后文件)需要导入路径带.js; - 但Jest在处理TS测试文件时,默认不会将
.js扩展名的导入映射到对应的.ts源文件,导致找不到模块; - 去掉扩展名后,TS和Jest能自动解析到源文件,但编译后的JS文件因为ESM要求带扩展名,Node运行时会找不到模块。
步骤1:配置Jest支持.js扩展名的导入
创建或修改jest.config.js(确保为ESM格式,使用export default):
export default { preset: 'ts-jest/presets/default-esm', // 把导入路径中的.js后缀去掉,映射到对应的TS文件 moduleNameMapper: { '^(\\.{1,2}/.*)\\.js$': '$1' }, // 把.ts文件当作ESM处理 extensionsToTreatAsEsm: ['.ts'], moduleFileExtensions: ['ts', 'js'], transform: { '^.+\\.ts$': ['ts-jest', { useESM: true }] } };
步骤2:调整TypeScript编译配置(tsconfig.json)
确保TS编译后保留.js扩展名,同时允许源文件中导入带.js的路径:
{ "compilerOptions": { // 使用Node.js的ESM模块解析规则 "module": "NodeNext", "moduleResolution": "NodeNext", "target": "ES2020", "outDir": "./dist", "esModuleInterop": true, "skipLibCheck": true, "strict": true }, "include": ["src/**/*"], "exclude": ["node_modules", "__tests__"] }
步骤3:验证三个命令
npm run dev:nodemon配合TS的ESM解析规则,会自动将.js导入映射到.ts源文件,正常运行;npm test:Jest通过moduleNameMapper处理.js导入,配合ts-jest的ESM模式,能正确找到TS模块;npm start:编译后的dist目录中,所有导入路径都保留了.js扩展名,Node.js作为ESM运行时能正确解析模块。
内容的提问来源于stack exchange,提问作者Jubileu
相关产品推荐
相关产品推荐

