You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 21:54:55