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

TypeScript Monorepo中无需build即可运行Jest测试的问题求助

解决方案:TypeScript Monorepo 无需build直接运行Jest测试

核心思路

让Jest直接解析TypeScript源码,而非依赖编译后的dist文件,同时正确识别Monorepo内部模块的路径和类型。

1. 配置ts-jest直接编译源码

首先确保安装必要依赖:

yarn add -D ts-jest @types/jest typescript

修改jest.config.ts,重点配置transform、moduleNameMapper和modulePaths:

import type { Config } from 'jest';

const config: Config = {
  preset: 'ts-jest',
  testEnvironment: 'node',
  // 用ts-jest处理所有TypeScript文件
  transform: {
    '^.+\\.tsx?$': ['ts-jest', {
      tsconfig: './tsconfig.json', // 指向根目录的tsconfig
    }],
  },
  // 映射内部模块到源码路径
  moduleNameMapper: {
    '^@project/utils$': '<rootDir>/packages/utils/src/index.ts',
    '^@project/(.*)$': '<rootDir>/packages/$1/src/index.ts',
  },
  // 告诉Jest去哪里找内部包
  modulePaths: ['<rootDir>/packages'],
  // 只测试源码文件,排除dist和node_modules
  testMatch: ['<rootDir>/packages/**/src/**/*.test.ts'],
  // 禁用缓存,避免源码修改后Jest用旧缓存
  cache: false,
};

export default config;

2. 调整内部包的package.json(关键)

给每个内部包的package.json添加exports字段,指定development环境下直接指向源码,避免Jest去读main/module指向的dist文件:

{
  "name": "@project/utils",
  "main": "./dist/cjs/index.js",
  "module": "./dist/esm/index.js",
  "types": "./dist/types/index.d.ts",
  "exports": {
    ".": {
      "development": "./src/index.ts",
      "types": "./dist/types/index.d.ts",
      "default": "./dist/cjs/index.js"
    }
  }
}

然后运行测试时带上环境变量,让Node识别development条件:

NODE_OPTIONS="--conditions=development" yarn test

3. 同步tsconfig的paths到Jest

如果你的根目录tsconfig.json已经配置了paths:

{
  "compilerOptions": {
    "baseUrl": ".",
    "paths": {
      "@project/*": ["packages/*/src"]
    }
  }
}

可以用tsconfig-paths-jest插件自动同步这些路径,避免手动写moduleNameMapper:

yarn add -D tsconfig-paths-jest

修改jest.config.ts,添加:

import type { Config } from 'jest';
import { pathsToModuleNameMapper } from 'ts-jest';
import { compilerOptions } from './tsconfig.json';

const config: Config = {
  // ...其他配置
  moduleNameMapper: pathsToModuleNameMapper(compilerOptions.paths, { prefix: '<rootDir>/' }),
};

export default config;

4. 检查Monorepo依赖关联

确保根目录package.json里的内部包依赖用workspace协议:

{
  "dependencies": {
    "@project/utils": "workspace:*"
  }
}

这样Yarn会把内部包关联到本地源码,而非下载到node_modules,Jest也能正确解析到包的位置。


内容的提问来源于stack exchange,提问作者Daniele Ricci

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 22:41:13