You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 11:42:47