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

如何解决Turborepo中Node.js TS项目的Prisma导入语法错误

解决Turborepo中Node.js TypeScript项目Prisma导入语法错误问题

问题描述

在Turborepo搭建的单体仓库中,Next.js应用使用共享Prisma配置正常运行,但Node.js TypeScript项目执行npm run start时抛出以下错误:

import { PrismaClient } from "@prisma/client";
^^^^^^
SyntaxError: Cannot use import statement outside a module

该错误的核心原因是Node.js将编译后的代码识别为CommonJS模块,但代码中使用了ES模块的import语法,二者不兼容导致解析失败。以下是具体的配置修复方案和初始化最佳实践:


具体修复步骤

1. 配置Node.js项目的package.json

在apps/services/package.json中添加"type": "module"字段,明确告知Node.js当前项目使用ES模块规范:

{
  "name": "@repo/services",
  "type": "module",
  "scripts": {
    "build": "tsc",
    "start": "node dist/index.js"
  },
  // 其他依赖配置...
}

2. 调整TypeScript编译配置

修改apps/services/tsconfig.json,确保编译输出ES模块格式,适配Node.js的ES模块解析规则:

{
  "extends": "@repo/typescript-config/base.json",
  "compilerOptions": {
    "strict": true,
    "esModuleInterop": true,
    "skipLibCheck": true,
    "forceConsistentCasingInFileNames": true,
    "outDir": "./dist",
    "rootDir": "./src",
    "module": "ESNext", // 指定输出ES模块
    "moduleResolution": "Bundler", // 适配ES模块的解析逻辑
    "target": "ES2020" // 选择支持ES模块的目标版本
  },
  "include": ["src/**/*"],
  "exclude": ["node_modules"]
}

同时检查根目录typescript-config/base.json,确保基础配置中的module和moduleResolution与上述设置一致,避免子项目继承冲突。

3. 同步共享DB包的模块配置

在packages/db/package.json中同样添加"type": "module",因为共享DB包的代码也使用了ES模块语法:

{
  "name": "@repo/db",
  "type": "module",
  "scripts": {
    "generate": "prisma generate",
    "migrate": "prisma migrate dev"
  },
  // 其他依赖配置...
}

4. 验证启动脚本正确性

确保apps/services/package.json的start脚本指向编译后的ES模块文件:

"scripts": {
  "build": "tsc",
  "start": "node dist/index.js"
}

如果需要开发模式下的热重载,可以安装tsx依赖后修改脚本:

"scripts": {
  "dev": "tsx watch src/index.ts",
  "build": "tsc",
  "start": "node dist/index.js"
}

Turborepo + Prisma + Node.js/Next.js 初始化最佳实践

  • 统一模块规范:所有子项目(apps和packages)均使用ES模块("type": "module"),彻底避免CommonJS与ES模块混用的语法冲突。
  • 共享Prisma包标准化配置:
    • 在packages/db中集中管理Prisma schema、迁移文件和客户端生成逻辑。
    • 在packages/db/package.json中添加Prisma schema路径配置:"prisma": {"schema": "./prisma/schema.prisma"},确保Prisma CLI能正确识别schema文件。
    • 在根目录turborepo.json中配置Prisma任务的缓存规则:
      {
        "pipeline": {
          "db#generate": {
            "outputs": ["node_modules/.prisma/client/**"]
          },
          "db#migrate": {
            "cache": false
          }
        }
      }
      
  • 复用TypeScript配置:通过typescript-config包统一管理基础编译规则,确保所有项目的配置一致性,减少重复配置和版本差异。
  • 环境变量集中管理:将数据库连接字符串等环境变量放在根目录或packages/db的.env文件中,通过Turborepo的环境变量共享机制传递给所有子项目,避免重复配置。
  • 开发流程优化:
    • 给Node.js服务添加热重载脚本(如tsx watch),提升开发效率。
    • 在根目录package.json中添加统一脚本,比如npm run build触发所有项目构建,npm run db:generate触发Prisma客户端生成。

内容的提问来源于stack exchange,提问作者Jagdish Padeliya

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 19:50:12