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

ng-mocks搭配jest-preset-angular使用时触发ES Module导入报错

问题环境与现象
  • 项目测试相关依赖版本:ng-mocks@13.5.2、jest-preset-angular@12、@ngneat/spectator@11
  • 触发条件:spec测试文件中调用MockComponents或MockPipe方法时固定抛出异常
  • 核心报错信息:

Must use import to load ES Module: /Users/scott/ltr/ltr/node_modules/@angular/core/fesm2020/core.mjs.

  • 关键错误堆栈:
at Runtime.requireModule (node_modules/jest-runtime/build/index.js:1011:21)
at node_modules/ng-mocks/webpack:/ng-mocks/webpack/universalModuleDefinition:3:36
at Object.__WEBPACK_EXTERNAL_MODULE__8900__ (node_modules/ng-mocks/webpack:/ng-mocks/webpack/universalModuleDefinition:10:19)
排查解决步骤
  • 先检查Jest模块转换配置
    该报错的核心原因是Jest默认以CommonJS规则加载模块,碰到Angular输出的ESM格式.mjs文件未做转译就会触发。打开项目根目录的jest.config.js,确认transformIgnorePatterns配置没有把@angular、ng-mocks相关包纳入忽略转译的范围,正确配置参考:
    transformIgnorePatterns: ['node_modules/(?!(@angular|ng-mocks)/)']
    
    该配置表示node_modules目录下只有@angular、ng-mocks开头的包会走Jest转译流程,其余依赖保持默认不转译,兼顾运行速度和模块兼容性。
  • 修复依赖版本错配问题
    当前使用的三个测试依赖存在明确的大版本适配断层:jest-preset-angular@12是为Angular 14及以上版本设计的,配套要求ng-mocks版本≥14.0.0、@ngneat/spectator版本≥12.0.0;当前安装的ng-mocks 13.x、@ngneat/spectator 11.x都是适配Angular 13及更低版本的,跨大版本混用会导致ng-mocks内部的模块识别逻辑无法匹配Angular包的ESM输出格式,直接触发加载错误。根据项目实际使用的Angular版本对齐依赖即可:
    • 若项目为Angular 13版本,将jest-preset-angular降级到11.x对应版本
    • 若项目为Angular 14及以上版本,将ng-mocks升级到14.x以上版本、@ngneat/spectator升级到12.x以上版本
      版本调整完成后删除node_modules目录和包管理锁文件(package-lock.json/yarn.lock/pnpm-lock.yaml),重新执行依赖安装命令。
  • 补全ESM模块识别配置
    如果前两步调整后仍报错,检查jest.config.js中的extensionsToTreatAsEsm配置,将.mjs后缀加入识别列表:
    extensionsToTreatAsEsm: ['.mjs', '.ts']
    
    同时确认jest-preset-angular的ESM相关配置项已开启,确保Jest运行时能正确处理ESM格式的依赖包。
  • 校验测试文件导入写法
    检查所有spec测试文件,MockComponents、MockPipe以及Angular核心API必须使用ES模块的import语法导入,禁止用require()方式加载这类ESM格式的包,CommonJS规范的导入方法会直接触发该类模块加载错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 08:54:19