为何Jest无法处理ES Module依赖?已尝试配置仍报错
解决Jest解析ESM依赖c2pa报错的问题
1. 让Jest转换器覆盖c2pa模块
你已经通过transformIgnorePatterns排除了c2pa,但得确保Jest的transform规则能处理该模块的文件。ts-jest默认只处理TS文件,而c2pa大概率是JS文件,所以需要新增babel-jest来处理JS类型的依赖文件:
修改Jest配置:
module.exports = { // ...其他原有配置 transform: { '^.+\\.tsx?$': 'ts-jest', '^.+\\.jsx?$': 'babel-jest', // 新增该行,让Babel处理JS文件 }, transformIgnorePatterns: ['/node_modules/(?!c2pa)/'], }
2. 补全Babel配置
仅添加转CommonJS的插件不够,还得让Babel能处理c2pa里的ESNext语法。给babel.config.json加上@babel/preset-env:
{ "presets": [ ["@babel/preset-env", { "targets": { "node": "current" } }] ], "env": { "test": { "plugins": ["@babel/plugin-transform-modules-commonjs"] } } }
如果c2pa用到了顶层await这类特性,还需要把@babel/plugin-syntax-top-level-await加到test环境的plugins数组中。
3. 确保ts-jest正确读取Babel配置
如果上级目录的babel.config.json没被ts-jest正确识别,可以直接在Jest配置里内联Babel配置:
module.exports = { // ...其他配置 globals: { 'ts-jest': { babelConfig: { presets: [["@babel/preset-env", { "targets": { "node": "current" } }]], env: { test: { plugins: ["@babel/plugin-transform-modules-commonjs"] } } } } } }
4. 直接mock c2pa模块(兜底方案)
如果以上方法都无效,直接mock整个c2pa模块,避免Jest解析它的ESM代码:
在Jest的moduleNameMapper中新增配置:
moduleNameMapper: { // ...原有配置 '^c2pa$': '<rootDir>/__mocks__/c2pa.js' }
然后在项目根目录创建__mocks__/c2pa.js,根据你实际用到的c2pa功能编写mock:
// 示例:mock你用到的createSigner方法 module.exports = { createSigner: jest.fn(), // 按需添加其他你用到的导出项 }
内容的提问来源于stack exchange,提问作者Dave Stein
相关产品推荐
相关产品推荐

