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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 16:15:47