Angular15+Jest29环境下ESM模块(如CKEditor)测试报错求助
解决方案:Angular 15 + Nx + Jest 29 兼容 ESM 模块测试
针对升级后ESM模块(CKEditor、ngxcharts等)测试报错的问题,按以下步骤调整配置:
1. 修正 jest.config.ts 配置
Jest 29对transform规则匹配顺序和ignore逻辑做了调整,需修改如下:
export default { extensionsToTreatAsEsm: ['.ts', '.mjs', '.js'], // 新增ESM类型文件标记 displayName: 'rich-text', setupFilesAfterEnv: ['<rootDir>/src/test-setup.ts'], coverageDirectory: '../../coverage/apps/rich-text', transform: { // 优先用babel-jest转译CKEditor和lodash-es相关文件 'node_modules/(lodash-es|@ckeditor)/.+\\.(js|mjs)$': 'babel-jest', // 其余文件用jest-preset-angular处理 '^.+\\.(ts|mjs|js|html|svg)$': 'jest-preset-angular', }, transformIgnorePatterns: [ // 只忽略未被transform匹配的node_modules文件 '/node_modules/(?!(lodash-es|@ckeditor)/)', '\\.pnp\\.[^\\/]+$' ], moduleNameMapper: { // 解决lodash-es的ESM导入问题 '^lodash-es$': 'lodash', }, snapshotSerializers: [ 'jest-preset-angular/build/serializers/no-ng-attributes', 'jest-preset-angular/build/serializers/ng-snapshot', 'jest-preset-angular/build/serializers/html-comment', ], // 启用ESM实验支持 testEnvironmentOptions: { customExportConditions: ['node', 'node-addons'], }, };
关键调整点:
- transform顺序:将babel-jest规则前置,确保CKEditor和lodash-es文件优先被转译
- transformIgnorePatterns:简化规则,只排除未被transform匹配的node_modules文件
- moduleNameMapper:将lodash-es映射为CommonJS版本,避免ESM导入报错
- testEnvironmentOptions:添加自定义导出条件,适配Node.js的ESM解析逻辑
2. 更新 babel.config.js
确保Babel能正确转译ESM到CommonJS:
module.exports = { presets: [ ['@babel/preset-env', { targets: { node: 'current' } }] ], plugins: [ '@babel/plugin-transform-modules-commonjs' // 解决CommonJS与ESM互操作问题 ] };
3. 正确执行测试命令
Nx测试命令需正确传递NODE_OPTIONS,格式如下:
NODE_OPTIONS="--experimental-vm-modules" nx test rich-text
注意:NODE_OPTIONS要放在nx命令前,确保Node进程能正确读取参数。
4. 依赖验证
确认jest-preset-angular版本与Angular 15兼容(当前13.0.0符合要求),babel-jest版本与Jest 29对齐(当前29.5.0符合要求)。若问题仍存在,删除node_modules和锁文件后重新安装依赖再测试。
内容的提问来源于stack exchange,提问作者Edward
相关产品推荐
相关产品推荐

