使用Jest测试oauth4webapi时遇Unexpected token 'export'错误求助
解决Jest测试中oauth4webapi的ESM语法转换问题
问题现象
在业务文件中通过import * as o from "oauth4webapi";引入包后,执行Jest测试时出现语法错误:
/Users/.../node_modules/oauth4webapi/build/index.js:7 export const clockSkew = Symbol(); ^^^^^^ SyntaxError: Unexpected token 'export' > 1 | import * as o from "oauth4webapi"; | ^
该包的.js文件使用了ESM的export const语法,导致Jest无法直接解析。
已尝试的无效方案
- 使用babel-jest转换js/jsx文件
- 在.babelrc中添加相关Babel包配置
- 为该包设置transformIgnorePatterns(搭配moduleDirectories配置)
- 在package.json中添加"type": "module"
当前配置文件
jest.config.ts
// jest.config.ts import type {Config} from 'jest'; const config: Config = { testEnvironment: 'jsdom', moduleNameMapper: { '^@/(.*)$': '<rootDir>/$1', '\\.(css|less|sass|scss)$': '<rootDir>/__mocks__/styleMock.js', '\\.(gif|ttf|eot|svg)$': '<rootDir>/__mocks__/fileMock.js', }, transform: { '^.+\\.tsx?$': 'ts-jest', '^.+\\.jsx?$': 'babel-jest', }, moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'node'], setupFiles: ['./jest.setup.ts'], transformIgnorePatterns: [ "/node_modules/(?!(oauth4webapi))" ], }; export default config;
.babelrc
{ "presets": ["@babel/preset-env"], "env": { "test": { "plugins": ["@babel/plugin-transform-modules-commonjs"] } } }
解决方案
1. 清理冲突配置
移除package.json中的"type": "module",避免Jest的CommonJS模块系统与ESM配置冲突。
2. 安装必要依赖
确保所有Babel相关依赖已安装:
npm install --save-dev @babel/core @babel/preset-env @babel/plugin-transform-modules-commonjs babel-jest
3. 调整Jest配置
修改jest.config.ts,优化转换规则和路径匹配:
// jest.config.ts import type {Config} from 'jest'; const config: Config = { testEnvironment: 'jsdom', moduleNameMapper: { '^@/(.*)$': '<rootDir>/$1', '\\.(css|less|sass|scss)$': '<rootDir>/__mocks__/styleMock.js', '\\.(gif|ttf|eot|svg)$': '<rootDir>/__mocks__/fileMock.js', }, // 优先用babel-jest处理js/jsx文件,确保oauth4webapi的ESM代码被转换 transform: { '^.+\\.jsx?$': 'babel-jest', '^.+\\.tsx?$': 'ts-jest', }, moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'node'], setupFiles: ['./jest.setup.ts'], // 用<rootDir>确保路径匹配精准,避免跨系统路径问题 transformIgnorePatterns: [ `<rootDir>/node_modules/(?!oauth4webapi/)` ], preset: 'ts-jest', globals: { 'ts-jest': { useESM: false, // 禁用ts-jest的ESM模式,保持与CommonJS一致 }, }, }; export default config;
4. 优化Babel配置(可选)
将.babelrc改为babel.config.js(Jest会优先读取该文件,配置范围更广):
// babel.config.js module.exports = { presets: ['@babel/preset-env'], env: { test: { plugins: ['@babel/plugin-transform-modules-commonjs'], }, }, };
方案说明
- 移除
"type": "module":当前项目基于TS+CommonJS的Jest配置,ESM模式会导致模块解析逻辑冲突; - 调整转换顺序:让babel-jest优先处理JS文件,确保oauth4webapi的ESM代码被转译为Jest可识别的CommonJS;
- 精准路径匹配:用
<rootDir>替换绝对路径,避免不同操作系统下的路径匹配失效; - 统一模块模式:禁用ts-jest的ESM模式,保持整个测试环境的模块系统一致。
内容的提问来源于stack exchange,提问作者wongx
相关产品推荐
相关产品推荐

