Angular项目Mocha测试遭遇ERR_REQUIRE_ESM错误求助
解决Angular E2E测试中Chai的ERR_REQUIRE_ESM错误
这个错误的核心原因是Chai v5+已经完全切换为ESM模块,而你的TypeScript编译后生成的是CommonJS代码,用require()引入ESM模块就会触发这个报错。以下是几个有效解决方案:
方案一:对齐模块系统,让TS编译生成ESM代码并配置Mocha支持
- 修改
e2e/tsconfig.json的compilerOptions:{ "compilerOptions": { "module": "ESNext", "moduleResolution": "node16", "target": "ES2020", "outDir": "../dist/e2e", // 保留其他原有配置 } } - 创建
.mocharc.json(替代过时的mocha.opts)放在项目根目录:{ "node-option": ["experimental-specifier-resolution=node"], "reporter": "mochawesome" } - 调整运行命令:
如果你不想手动编译TS,可以直接用ts-node运行Mocha(需要先装ts-node:npm install ts-node --save-dev):
坚持先编译再运行的话,命令改成:npx mocha e2e/tests/**/*.spec.ts --config .mocharc.jsontsc -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
相关产品推荐
相关产品推荐

