Vercel部署时Linting与类型校验失败但本地构建正常
问题成因
这个问题和Vercel环境类型校验更严格没有关系,本质是本地和Vercel构建环境的Prisma Client类型定义不一致,加上本地构建默认跳过了类型检查导致的环境差异:
- create-t3-app初始化的项目默认在
next.config.mjs中做了构建优化:本地开发环境下会默认跳过TypeScript类型校验和ESLint检查,避免每次构建等待时间过长,这就是你本地执行next build、vercel build都不报错的直接原因。 - Vercel部署环境不会读取本地的跳过配置,安装依赖后会自动执行
prisma generate基于仓库内最新的schema.prisma生成全量Prisma Client类型,之后执行严格的类型校验。报错提示password不存在于UserSelect类型中,只有一个核心原因:当前提交到仓库的schema.prisma里,User模型没有定义password字段,或者该字段加了@ignore注解被Prisma排除在生成的类型之外。 - 你本地写代码时能正常引用
password字段,是因为之前本地加该字段时执行过prisma generate,后续修改schema后没有重新生成客户端类型,本地一直用的是旧的带password字段的类型缓存。
解决方案
按以下步骤排查修复即可:
- 先核对仓库内的
prisma/schema.prisma文件,确认User模型中存在password字段定义,且没有加@ignore注解,参考配置:
model User { id String @id @default(cuid()) name String? email String? @unique emailVerified DateTime? image String? password String? // 确认该行存在 accounts Account[] sessions Session[] }
- 本地清除旧的Prisma缓存,重新生成最新的客户端类型:
rm -rf node_modules/.prisma npx prisma generate
- 打开项目根目录的
next.config.mjs,临时关闭构建时的类型、ESLint跳过配置,让本地构建和Vercel环境校验规则对齐:
/** @type {import("next").NextConfig} */ const config = { // 其他原有配置保持不变 typescript: { ignoreBuildErrors: false, }, eslint: { ignoreDuringBuilds: false, }, }; export default config;
- 本地执行
npm run build(对应next build命令),此时如果类型有问题会直接在本地复现,和Vercel端报错一致。 - 检查
.gitignore配置,确认没有把prisma/schema.prisma加入忽略列表,避免提交到仓库的是缺失字段的旧版本schema。 - 本地构建校验通过后,把所有改动提交推送到仓库,重新触发Vercel构建即可。修复完成后可以把
next.config.mjs里的跳过规则改回原有配置,不影响部署校验。
内容的提问来源于stack exchange,提问作者AndreasWT
相关产品推荐
相关产品推荐

