ES2020/ESNEXT TS+Vue+Vite项目使用ts-jest运行Jest测试失败如何解决
你遇到的报错核心原因是:Jest 默认以 CommonJS 模块模式运行测试,而 import.meta 是 ES 模块专属的语法特性,即使你的 tsconfig.json 配置了输出 ES 模块,ts-jest 默认也会根据 Jest 的运行环境将代码转译为 CommonJS 格式,转译过程不会处理 import.meta 语法,最终导致运行报错。之前能正常运行大概率是旧版本的工具链对未识别语法的容错度更高,或者你之前的代码中没有实际触发import.meta的运行时读取逻辑,Node 版本升级后对语法校验更严格就触发了报错。
以下是两种可落地的解决方法,可根据项目需求选择:
方案一:配置 Jest 以 ES 模块模式运行(推荐,和 Vite 项目的模块体系一致)
- 修改
jest.config.ts配置,增加 ES 模块相关的适配:
import { resolve } from "path"; import type { Config } from "@jest/types"; const config: Config.InitialOptions = { verbose: true, testEnvironment: "jsdom", // 新增:识别 .ts 为 ES 模块后缀 extensionsToTreatAsEsm: ['.ts'], transform: { "^.+\\.tsx?$": ["ts-jest", { // 新增:开启 ts-jest 的 ES 模块支持 useESM: true, // 指定和项目一致的 tsconfig 配置,避免和全局配置冲突 tsconfig: { module: "ES2020", target: "ESNext" } }], }, testPathIgnorePatterns: ["/node_modules/"], moduleNameMapper: { "^[/]{0,1}~/(.*)$": resolve(process.cwd(), "src", "$1"), }, testMatch: ["**/?(*[-.])+(spec|test).ts"], setupFilesAfterEnv: ["jest-extended"], }; export default config;
- 修改测试启动脚本,Node 14 版本对 ES 模块的支持是实验性的,需要加启动参数:
在package.json的scripts中修改 test 命令:
{ "scripts": { "test": "NODE_OPTIONS=--experimental-vm-modules jest" } }
如果需要兼容 Windows 系统,可以安装 cross-env 后把命令改为 cross-env NODE_OPTIONS=--experimental-vm-modules jest。
方案二:保持 CommonJS 运行模式,Mock 掉 import.meta
如果你不想改动 Jest 的运行模块模式,可以直接全局 Mock import.meta 的值,适配测试场景:
- 新建
jest-setup.ts文件,放在项目根目录:
// 全局注入 import.meta 的模拟值,根据你实际用到的属性补充 declare global { interface ImportMeta { url: string; // 如果你用到 Vite 的环境变量,再加 env 配置 env: Record<string, any> } } globalThis.import.meta = { url: 'http://localhost', env: { MODE: 'test', // 补充你实际用到的所有环境变量 } }
- 修改
jest.config.ts引入这个初始化文件:
const config: Config.InitialOptions = { // 其他配置保持不变 setupFilesAfterEnv: ["jest-extended", "<rootDir>/jest-setup.ts"], }
额外注意
你的 TypeScript 版本为 4.4.2,需要确认 ts-jest 版本为 27.x 版本,更高版本的 ts-jest 不再适配 TS 4.4,会引发其他兼容问题。
内容的提问来源于stack exchange,提问作者ken
相关产品推荐
相关产品推荐

