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

Angular项目Mocha测试遭遇ERR_REQUIRE_ESM错误求助

解决Angular E2E测试中Chai的ERR_REQUIRE_ESM错误

这个错误的核心原因是Chai v5+已经完全切换为ESM模块,而你的TypeScript编译后生成的是CommonJS代码,用require()引入ESM模块就会触发这个报错。以下是几个有效解决方案:

方案一:对齐模块系统,让TS编译生成ESM代码并配置Mocha支持

  1. 修改e2e/tsconfig.json的compilerOptions:
    {
      "compilerOptions": {
        "module": "ESNext",
        "moduleResolution": "node16",
        "target": "ES2020",
        "outDir": "../dist/e2e",
        // 保留其他原有配置
      }
    }
    
  2. 创建.mocharc.json(替代过时的mocha.opts)放在项目根目录:
    {
      "node-option": ["experimental-specifier-resolution=node"],
      "reporter": "mochawesome"
    }
    
  3. 调整运行命令:
    如果你不想手动编译TS,可以直接用ts-node运行Mocha(需要先装ts-node:npm install ts-node --save-dev):
    npx mocha e2e/tests/**/*.spec.ts --config .mocharc.json
    
    坚持先编译再运行的话,命令改成:
    tsc -p e2e && node --experimental-specifier-resolution=node node_modules/mocha/bin/mocha dist/e2e/tests --reporter mochawesome
    

方案二:降级Chai到CommonJS兼容版本

如果不想折腾模块配置,直接降级到Chai v4.x(它同时支持CommonJS和ESM):

npm install chai@4.x --save-dev

这个方案最快捷,不需要修改任何配置文件。

方案三:在测试文件中使用动态import()

修改你的.spec.ts文件,把静态import换成动态import(需要包裹在异步函数里):

(async () => {
  const { expect } = await import('chai');

  describe('My Test Suite', () => {
    it('should pass basic assertion', () => {
      expect(1 + 1).to.equal(2);
    });
  });
})();

注意这个方案需要修改所有测试文件的结构,适合小范围测试场景。

为什么之前的尝试无效?

  • mocha.opts已经被Mocha弃用,官方推荐用.mocharc.json或命令行参数配置
  • 仅设置moduleResolution: node和esModuleInterop: true无法解决纯ESM模块的引入问题,这两个配置只处理CommonJS模块的互操作
  • npx和npm的调用方式不影响模块系统的兼容性,所以换npx没用

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 10:45:14