Jest测试文件中CommonJS require引入依赖报SyntaxError语法错误
问题原因
- 报错本质是Jest无法识别CoffeeScript语法:项目依赖的第三方包
generate-key入口直接引用了未编译为原生JS的.coffee后缀CoffeeScript源码文件,CoffeeScript里用->定义函数的语法不符合原生JS规范,Jest默认按JS规则解析文件时,碰到>字符就会抛出非法token的语法错误。 - 当前Jest配置缺少两类必要规则:既没有配置CoffeeScript对应的转译逻辑,也没有配置跳过node_modules中非标准JS文件解析的忽略规则,导致Jest直接去解析本不该在测试运行时处理的coffee源码。
- 贴出的测试文件、被测common.js文件本身没有语法问题,不需要修改业务代码。
解决方法
按优先级从高到低选择以下方案即可:
方案1:补全Jest转译配置(最快修复)
- 先安装转译需要的开发依赖:
npm install --save-dev babel-jest @babel/preset-env coffeescript
- 修改
jest.config.js配置,添加转译和忽略规则:
module.exports = { clearMocks: true, coverageDirectory: 'coverage', testEnvironment: 'node', moduleFileExtensions: ['ts', 'js', 'json', 'node', 'coffee'], // 不忽略generate-key包,让其走转译流程 transformIgnorePatterns: ['/node_modules/(?!(generate-key)/)'], // 对js和coffee文件走babel转译 transform: { '^.+\\.(js|coffee)$': 'babel-jest' } };
- 在项目根目录新建
.babelrc配置文件,指定转译规则:
{ "presets": [ ["@babel/preset-env", { "targets": { "node": "current" } }] ] }
- 重新执行
npm run test即可正常运行测试。
方案2:替换不规范的依赖(根源解决)
generate-key包本身发布流程不规范:正常发布到npm的Node包,应该提前把CoffeeScript/TS等源码编译为纯JS文件,不需要用户侧额外配置转译。可以替换成同功能、发布规范的密钥生成类库,彻底避免这类第三方包带来的配置问题。
方案3:排查冗余依赖
如果业务代码没有直接使用generate-key的功能,说明这个包是其他第三方依赖间接引入的,可以通过npm ls generate-key命令查看依赖引入路径,移除冗余依赖、或者把对应依赖锁定到无该问题的稳定版本,也可以解决问题。
内容的提问来源于stack exchange,提问作者Amtrak
相关产品推荐
相关产品推荐

