ES2022模块配置下Cucumber+Playwright无法识别.ts文件求助
解决Cucumber + Playwright集成中ES模块与CommonJS冲突问题(无需修改tsconfig)
问题核心
你的TS配置指定了target: ES2022和module: ES2022,且项目package.json中设置了"type": "module",导致所有TS文件被识别为ES模块。但Cucumber默认用require(CommonJS语法)加载模块,触发了ES模块无法被require()加载的错误。
解决方案(无需修改tsconfig)
核心是调整Cucumber配置,改用ES模块的加载方式:
- 修改cucumber.cjs配置
将原配置中的require替换为import,并改用支持ES模块的TS加载器:
const config = { paths: ['tests/acceptance/features/**/*.feature'], import: ['tests/acceptance/step_definitions/**/*.ts'], // 替换require为import requireModule: ['ts-node/esm'], // 使用ES模块版本的ts-node加载器 format: [ 'summary', 'progress-bar', ], formatOptions: { snippetInterface: 'async-await' }, publishQuiet: true, }; module.exports = { default: config };
- 添加ts-node的ES模块配置(可选但推荐)
在tsconfig.json中加入ts-node的ES模块支持配置,避免加载路径问题:
{ "compilerOptions": { "target": "ES2022", "module": "ES2022", // 其他原有配置... }, "ts-node": { "esm": true, "experimentalSpecifierResolution": "node" } }
- 备选方案:用esbuild加速加载
如果ts-node/esm运行缓慢或有兼容性问题,可以改用@esbuild-kit/cjs-loader:
- 安装依赖:
npm install -D @esbuild-kit/cjs-loader - 修改cucumber.cjs的
requireModule:requireModule: ['@esbuild-kit/cjs-loader']
原理说明
- Cucumber的
import配置项会使用ES模块的import()语法加载你的TS文件,适配项目的ES模块环境 ts-node/esm或@esbuild-kit/cjs-loader负责将TS的ES模块代码实时转换为可执行的JS,无需修改原有tsconfig的编译目标和模块设置
验证
运行你的Cucumber测试命令(如npx cucumber-js),此时应该能正常启动Playwright并执行测试用例。
内容的提问来源于stack exchange,提问作者ruddnisrus
相关产品推荐
相关产品推荐

