如何在NextJS的TypeScript文件中正确使用ES6 Modules语法
问题根因
该冲突由Node.js模块规则、TypeScript执行逻辑和Prisma默认seed调用逻辑不匹配导致:
- 未在package.json配置
"type": "module"时,Node.js默认将.ts/.js文件识别为CommonJS模块,不支持顶层import语法,触发import无法识别的报错 - 配置
"type": "module"后,Node.js原生ESM加载器不识别.ts后缀文件,触发未知文件后缀报错
解决方案
方案1:全项目启用ESM(推荐)
无需改动TS代码中的ESM语法,调整执行配置即可:
- 保留package.json中的
"type": "module"配置 - 安装必要依赖:
npm install ts-node typescript @types/node --save-dev - 修改package.json中prisma的seed配置项:
将原有seed命令替换为:"node --no-warnings --loader ts-node/esm prisma/seed.ts" - 确认tsconfig.json中包含以下配置:
{ "compilerOptions": { "target": "ESNext", "module": "ESNext", "moduleResolution": "Node", "esModuleInterop": true } }
配置完成后重新运行seed命令即可正常执行。
方案2:仅TS层支持ESM语法,项目保持CommonJS模式
如果不想将整个项目切换为ESM模式,可以用TS编译适配:
- 删除package.json中的
"type": "module"配置 - 调整tsconfig.json配置:
{ "compilerOptions": { "target": "ESNext", "module": "CommonJS", "esModuleInterop": true, "allowSyntheticDefaultImports": true } }
- 保持seed命令为
ts-node prisma/seed.ts即可,TS代码中可正常使用import/export语法,运行时会自动编译为CommonJS格式执行。
内容的提问来源于stack exchange,提问作者gnarois
相关产品推荐
相关产品推荐

