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

Node.js + Lerna 单仓中Jest无法识别import语句的问题排查

问题原因分析

核心问题出在Jest与ES模块环境的兼容性配置上:

  1. 当项目包中设置"type": "module"后,Node会将.js文件识别为ES模块,但Jest默认仍将.js视为CommonJS处理,导致babel-jest的转换逻辑未被正确触发。
  2. 你的jest.config.js和babel.config.js使用CommonJS格式(module.exports),与项目整体的ES模块环境存在加载兼容性冲突。
  3. Babel预设未明确指定模块转换规则,ES模块语法没有被转译为Jest可识别的格式。
解决步骤

1. 统一配置文件为ES模块格式

修改根目录的jest.config.js,改用ES模块语法,并添加Jest识别ES模块的关键配置:

export default {
  transform: {
    '^.+\\.jsx?$': 'babel-jest',
  },
  extensionsToTreatAsEsm: ['.js'], // 强制Jest将.js文件当作ES模块处理
  moduleNameMapper: {
    '^(\\.{1,2}/.*)\\.js$': '$1', // 适配ES模块导入时的.js扩展名
  },
};

同时在**根目录的package.json**中添加"type": "module",确保Jest加载配置文件时遵循ES模块规则。

2. 调整Babel配置明确模块转换

修改babel.config.js为ES模块格式,并强制将ES模块转译为CommonJS(Jest对原生ES模块的支持仍有局限):

export default {
  presets: [
    ['@babel/preset-env', {
      targets: { node: 'current' },
      modules: 'commonjs', // 明确转译为CommonJS供Jest识别
    }],
  ],
};

3. 统一依赖版本避免兼容性问题

确保@babel/core、@babel/preset-env、babel-jest版本匹配,执行以下命令更新:

npm install @babel/core@latest @babel/preset-env@latest babel-jest@latest --save-dev

4. 正确使用Lerna执行测试

在根目录通过Lerna统一触发测试,确保每个包的ES模块环境被正确加载:

lerna run test --stream
额外排查点
  • 检查所有测试文件和源码文件的扩展名均为.js,导入语句中的.js扩展名会被moduleNameMapper自动处理。
  • 若使用jest.mock等API,确保语法符合ES模块规范(例如用import导入被Mock的模块)。

内容的提问来源于stack exchange,提问作者Ydonut13

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 22:15:13