TypeScript下Jest导入第三方ESM模块报unexpected token错误如何修复
报错根因
Jest默认跳过node_modules目录下所有文件的转译流程,直接以CommonJS语法执行代码。@my-cool-package/fcm输出的是ESM格式的代码,包含import语法,未经过转译就被Jest加载会直接触发语法错误。
当前配置的核心错误是将需要转译的node_modules包规则写在了testPathIgnorePatterns字段中——该字段仅用于指定哪些路径下的文件不会被识别为测试用例,和模块转译逻辑完全无关,因此配置不生效。
修复方案
- 删除
testPathIgnorePatterns中错误添加的/node_modules/(?!@my-cool-package/)规则 - 新增
transformIgnorePatterns配置项,指定哪些node_modules下的包需要豁免默认忽略规则、交由ts-jest转译 - 修正
transform字段的正则匹配规则,避免漏匹配js/jsx格式文件
修正后的完整配置
module.exports = { roots: ['./src'], transform: { '^.+\\.(ts|tsx|js|jsx)$': 'ts-jest', }, // 配置转译忽略规则:默认忽略所有node_modules文件,放行@my-cool-package、@capacitor开头的依赖 transformIgnorePatterns: [ '/node_modules/(?!(@my-cool-package|@capacitor)/)' ], testPathIgnorePatterns: [ '/src/context/__mocks__', ], testRegex: '(/test/.*|\\.(test|spec))\\.(ts|tsx|js)$', modulePaths: ['<rootDir>'], moduleFileExtensions: ['ts', 'tsx', 'js', 'json'], moduleNameMapper: { '^me/(.*)': '<rootDir>/src/me/$1', '\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$': '<rootDir>/assetsTransformer.js', '\\.(css|less)$': 'identity-obj-proxy', '^@src(.*)$': '<rootDir>/src$1', }, }
额外注意事项
- 如果修改配置后仍出现模块解析报错,检查tsconfig.json中
compilerOptions.module字段值,测试环境下建议设置为CommonJS。如果业务代码需要保留ESM配置,可以单独新建测试专用的tsconfig文件,通过ts-jest配置指定加载:
transform: { '^.+\\.(ts|tsx|js|jsx)$': ['ts-jest', { tsconfig: '<rootDir>/tsconfig.test.json' }] }
- 后续如果引入其他输出ESM格式的第三方依赖(尤其是capacitor生态的插件),直接将包名追加到
transformIgnorePatterns的正则豁免分组中即可。
内容的提问来源于stack exchange,提问作者Sabbir Ahmed
相关产品推荐
相关产品推荐

