如何解决Turborepo中Node.js TS项目的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客户端生成。
- 给Node.js服务添加热重载脚本(如
内容的提问来源于stack exchange,提问作者Jagdish Padeliya

