NPM工作区单仓中多Express后端与Remix共享Prisma类型方案咨询
多Prisma模型的类型共享方案(NPM工作区场景)
针对你在NPM工作区单仓里,要让Remix应用和两个带独立Prisma模型的Express后端共享两类类型的需求,这里给几个实用方案:
方案1:创建独立的类型共享包
这是最规范的长期方案,适合规模较大的项目:
- 在工作区根目录新增一个包(比如命名为
@repo/prisma-types),初始化package.json并配置类型导出规则 - 修改两个Express后端的
schema.prisma,将Prisma Client的输出路径指向这个共享包的对应目录,同时开启仅生成类型声明:// 第一个Express后端的schema.prisma generator client { provider = "prisma-client-js" output = "./../prisma-types/generated/backend1" emitDeclarationOnly = true } // 第二个Express后端的schema.prisma同理,output指向../prisma-types/generated/backend2 - 在
@repo/prisma-types的package.json里配置导出映射,让其他包能精准导入对应后端的类型:{ "name": "@repo/prisma-types", "type": "module", "exports": { "./backend1": "./generated/backend1/index.d.ts", "./backend2": "./generated/backend2/index.d.ts" }, "typesVersions": { "*": { "backend1": ["./generated/backend1/index.d.ts"], "backend2": ["./generated/backend2/index.d.ts"] } } } - 在Remix和两个Express后端中,通过工作区安装这个共享包:
npm install @repo/prisma-types --workspace=remix-app npm install @repo/prisma-types --workspace=backend1 npm install @repo/prisma-types --workspace=backend2 - 使用时直接按需导入类型:
import type { User } from '@repo/prisma-types/backend1'; import type { Order } from '@repo/prisma-types/backend2';
方案2:通过TS路径别名共享类型(无需新增包)
如果不想额外维护一个共享包,可以直接通过TS路径别名实现:
- 在工作区根目录创建
prisma-types目录,用于存放两个后端生成的类型文件 - 修改两个Express后端的
schema.prisma,将类型输出到这个目录:generator client { provider = "prisma-client-js" output = "./../prisma-types/backend1" emitDeclarationOnly = true } - 在Remix和两个Express后端的
tsconfig.json中,添加路径别名指向生成的类型文件:{ "compilerOptions": { "paths": { "@prisma-types/backend1": ["../prisma-types/backend1/index.d.ts"], "@prisma-types/backend2": ["../prisma-types/backend2/index.d.ts"] } } } - 执行
prisma generate命令生成类型后,三个包就能直接通过别名导入对应类型,无需额外安装依赖
方案3:手动提取共享类型(适合小项目)
如果模型数量少、变更不频繁,可以手动提取需要共享的类型:
- 从两个Express后端生成的
prisma/client/index.d.ts中,复制需要共享的类型定义,放到工作区根目录的shared-types目录下(比如shared-types/backend1.ts、shared-types/backend2.ts) - 在各包的
tsconfig.json中配置路径别名指向shared-types:"paths": { "@shared-types/*": ["../shared-types/*"] } - 缺点是模型变更后需要手动同步类型,适合快速迭代的小型项目
通用注意事项
- 在工作区根目录的
package.json中添加统一的类型生成脚本,方便批量更新:"scripts": { "generate:prisma": "npm run prisma generate --workspace=backend1 && npm run prisma generate --workspace=backend2" } - Remix端只需要类型声明,无需Prisma Client运行时,所以务必开启
emitDeclarationOnly,避免打包时引入冗余代码
内容的提问来源于stack exchange,提问作者cartes_dev
相关产品推荐
相关产品推荐

