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
相关产品推荐
相关产品推荐

