在npm Monorepo架构中如何处理Prisma共享类型
在npm Monorepo架构中如何处理Prisma共享类型
我太懂这种手动复制枚举导致两边不一致的痛苦了!给你分享几个实际可用的方案,完美解决这个问题:
方案一:用Prisma生成器自动同步到共享包
这是最省心的方式,让Prisma自动把枚举(或其他需要共享的类型)输出到@common/types包,完全不用手动维护:
- 首先在BE的
schema.prisma文件里添加一个自定义生成器,专门用来生成共享类型:
generator client { provider = "prisma-client-js" // BE自己的client还是保留在本地,不影响原有使用 output = "./node_modules/.prisma/client" } generator sharedTypes { provider = "prisma-generator-ts" // 指定输出到共享包的目录,路径根据你的monorepo结构调整 output = "../../packages/common/src/prisma-shared" // 配置只生成我们需要的枚举,避免冗余 includeEnums = true includeModels = false emitDMMF = false }
- 安装对应的生成器依赖(在BE目录或根目录安装都行):
npm install prisma-generator-ts --save-dev
- 运行生成命令,把枚举同步到共享包:
npx prisma generate
- 在
@common/types的src/index.ts里导出这些枚举,方便其他包引用:
export * from './prisma-shared/enums';
这样一来,不管你在BE的Prisma schema里怎么修改枚举,只要重新运行prisma generate,共享包的类型就会自动更新。FE和BE都直接从@common/types导入枚举,再也不会出现不一致的问题!
方案二:手动导出Prisma原生类型(适合不想加依赖的场景)
如果不想用第三方生成器,也可以直接复用Prisma自动生成的类型:
- 在BE的代码里创建一个导出文件,比如
src/shared-types.ts,把需要共享的枚举导出来:
import { Prisma } from '@prisma/client'; // 导出需要共享的枚举 export const UserRole = Prisma.UserRole; export type UserRole = Prisma.UserRole;
- 在BE的
package.json里添加导出配置,让共享包可以引用这些类型:
{ "exports": { "./shared-types": "./src/shared-types.ts" } }
- 在
@common/types的src/index.ts里导入并重新导出:
export * from '@your-be-package/shared-types';
这种方式不用额外安装生成器,但每次新增或修改枚举时,都需要手动在BE的导出文件里更新,适合枚举变动不频繁的项目。
注意事项
- 不管用哪种方案,都要确保monorepo的依赖管理工具(pnpm/yarn workspaces/npm workspaces)能正确识别包之间的引用关系
- 如果你用了Turbo、Nx这类构建工具,记得给生成类型的步骤添加缓存配置,避免重复生成
备注:内容来源于stack exchange,提问作者maklmor
相关产品推荐
相关产品推荐

