升级Jest至28后React库测试报错:helperSkipTransparentExpressionWrappers相关函数异常
Jest 27升级至28后测试报错:
helperSkipTransparentExpressionWrappers.skipTransparentExprWrapperNodes is not a function 问题现象
将Jest从27版本升级到28后,React库的所有测试均无法运行,抛出错误:
helperSkipTransparentExpressionWrappers.skipTransparentExprWrapperNodes is not a function
报错路径指向node_modules/@babel/preset-env/node_modules/@babel/plugin-proposal-optional-chaining/src/transform.ts。
问题根源
核心原因是Babel相关依赖版本不匹配:
- 本地直接安装的
@babel/plugin-proposal-optional-chaining为7.21.0版本,它依赖的@babel/helper-skip-transparent-expression-wrappers@7.20.0确实导出了skipTransparentExprWrapperNodes方法; - 但
@babel/preset-env@7.20.2的嵌套依赖中,自带的@babel/plugin-proposal-optional-chaining是7.18.9版本,这个旧版本插件尚未引入该helper方法,或调用逻辑与当前helper版本不兼容,导致调用时出现“不是函数”的错误。
解决方案
1. 统一Babel预设与插件版本
将@babel/preset-env升级到与@babel/plugin-proposal-optional-chaining匹配的版本(建议7.21.0及以上),让预设依赖的插件版本同步更新,避免嵌套旧版本插件冲突:
# npm npm install @babel/preset-env@^7.21.0 --save-dev # yarn yarn add @babel/preset-env@^7.21.0 --dev
2. 清理依赖重新安装
删除node_modules目录和锁文件,重新安装依赖确保依赖树完全同步:
# 删除依赖目录和锁文件 rm -rf node_modules package-lock.json # 重新安装 npm install
3. 强制指定插件版本(可选)
如果无法直接升级@babel/preset-env,可通过包管理器的版本强制覆盖功能,让@babel/preset-env使用最新插件版本:
- npm:在
package.json中添加overrides字段:"overrides": { "@babel/preset-env": { "@babel/plugin-proposal-optional-chaining": "^7.21.0" } } - yarn:在
package.json中添加resolutions字段:"resolutions": { "@babel/preset-env/@babel/plugin-proposal-optional-chaining": "^7.21.0" }
添加后重新安装依赖即可生效。
4. 检查Jest的Babel配置
确保Jest配置文件(如jest.config.js)中指定的Babel预设和插件,优先使用项目根目录下安装的最新版本,避免加载嵌套的旧依赖。
内容的提问来源于stack exchange,提问作者Nathan Brenner
相关产品推荐
相关产品推荐

