NextJS+TS项目执行Prisma db seed时遇ESM模块兼容错误
解决Prisma Seed中ESM与CommonJS兼容问题
问题背景
基于TypeScript、Prisma和Next.js的项目,执行yarn prisma db seed时遇到模块兼容错误:
- 运行seed脚本时出现
Error [ERR_REQUIRE_ESM]: require() of ES Module,原因是prisma/seed.ts导入的../src/server/db/client依赖了.mjs文件 - 调整ts-node编译选项后,又出现
SyntaxError: Cannot use import statement outside a module,无法同时兼容TypeScript文件和.mjs文件的导入
可行解决方案
1. 更新package.json配置
修改scripts中的ts-node命令,添加ESM支持和模块解析选项,同时确保prisma的seed命令正确:
{ "name": "...", "version": "0.1.0", "private": true, "scripts": { "ts-node": "ts-node --esm --experimental-specifier-resolution=node --compiler-options '{\"module\": \"ESNext\", \"moduleResolution\": \"node\"}'", // 其他原有脚本保持不变 }, // 依赖项保持不变 "prisma": { "seed": "yarn ts-node prisma/seed.ts" } }
2. 优化tsconfig.json的ts-node配置
调整ts-node字段,明确启用ESM模式并指定模块解析策略:
{ "compilerOptions": { // 原有配置保持不变 "module": "esnext", "moduleResolution": "node" }, "ts-node": { "esm": true, "experimentalSpecifierResolution": "node", "compilerOptions": { "module": "ESNext", "moduleResolution": "node" } }, "include": ["next-env.d.ts", "types/**/*.ts", "next-auth.d.ts", "**/*.ts", "**/*.tsx", "**/*.js", "**/*.cjs", "**/*.mjs"], "exclude": ["node_modules"] }
3. 验证seed脚本
prisma/seed.ts无需修改,保持原有导入逻辑即可:
import { prisma } from '../src/server/db/client'; const main = async () => { console.log('seeding'); // 在此添加你的具体seed数据逻辑 }; main() .catch((e) => { console.error(e); process.exit(1); }) .finally(async () => { await prisma.$disconnect(); });
4. 执行seed命令
运行以下命令测试:
yarn prisma db seed
原理说明
--esm参数让ts-node以ESM模式运行,原生支持import语句--experimental-specifier-resolution=node启用Node.js风格的模块解析规则,兼容.mjs文件的导入- 统一
module和moduleResolution配置为ESNext和node,确保TypeScript代码与ESM模块的解析逻辑一致
内容的提问来源于stack exchange,提问作者mcclosa
相关产品推荐
相关产品推荐

