Vue3+Jest环境引入@microsoft/signalr报Unexpected token 'export'错误如何解决
问题根因
该报错的核心原因是:@microsoft/signalr 包的ESM构建产物使用了标准ES模块的export语法,而Jest默认运行在CommonJS环境下,你当前配置的transformIgnorePatterns设置为忽略全部node_modules下的文件,导致该包的ES语法没有被转译为Jest可识别的CommonJS语法。
同时你当前配置的transform规则存在优先级冲突:先声明的.ts文件用ts-jest处理的规则,会被后声明的.ts/.js文件用babel-jest处理的规则覆盖,也可能引发TS语法转译异常。
修复步骤
- 第一步:调整
transformIgnorePatterns配置,排除@microsoft/signalr包,让转译器处理该包的代码
将jest.config.js中对应的配置改为:
transformIgnorePatterns: ['node_modules/(?!(@microsoft/signalr)/)'],
该正则的含义为:忽略node_modules下除了@microsoft/signalr之外的所有文件,不对其做转译处理。
第二步:修正
transform规则优先级,避免规则覆盖
根据你的项目技术栈二选一即可:- 如果你需要保留
ts-jest做类型校验,调整规则顺序:
transform: { '.*\\.(vue)$': 'vue3-jest', '^.+\\.scss$': 'jest-scss-transform', '^.+\\.tsx?$': 'ts-jest', '^.+\\.jsx?$': 'babel-jest', },- 如果你不需要
ts-jest做类型校验,直接合并规则:
transform: { '.*\\.(vue)$': 'vue3-jest', '^.+\\.scss$': 'jest-scss-transform', '^.+\\.[tj]sx?$': ['babel-jest', { presets: ['@babel/preset-typescript'] }] },- 如果你需要保留
第三步:确认Babel配置支持ES模块转译
在项目根目录的.babelrc或babel.config.json中添加以下配置,用来把ES模块转译为CommonJS:
{ "presets": [ ["@babel/preset-env", { "targets": { "node": "current" } }], "@babel/preset-typescript" ] }
如果缺少对应依赖,执行以下命令安装:npm install @babel/preset-env @babel/preset-typescript --save-dev
- 备选快速方案
如果不想调整转译规则,可直接修改signalr的导入路径,使用已经编译为UMD格式的兼容产物,无需额外转译即可运行:
把原导入语句替换为:
import * as signalR from '@microsoft/signalr/dist/browser/signalr.min.js';
内容的提问来源于stack exchange,提问作者Nelu
相关产品推荐
相关产品推荐

