升级NextJS 13.5后Vercel部署出现GraphQL Schema重复类型错误
解决NextJS 13.5 + Vercel部署时GraphQL重复类型"h"的问题
核心原因
错误中的"h"是生产环境下代码压缩/混淆后生成的短类型名,本地开发未开启极致压缩所以不会触发。问题本质是Next.js的SWC压缩优化导致GraphQL Schema构建过程中生成了重复的压缩类型名,或是无服务器函数冷启动时重复构建Schema引发的冲突。
具体解决方案
1. 缓存GraphQL Schema,避免重复构建
无服务器函数冷启动会多次执行初始化代码,重复构建Schema容易导致类型名冲突。将Schema构建改为单例模式:
// 全局缓存Schema实例 let cachedSchema; function getSchema() { if (!cachedSchema) { cachedSchema = buildSchemaSync({ authChecker: UserAuthority, resolvers: [...] }); } return cachedSchema; } // 初始化Apollo Server时使用缓存的Schema const server = new ApolloServer({ schema: getSchema(), introspection: true, csrfPrevention: true, plugins, cache: 'bounded' });
2. 配置Next.js排除GraphQL代码的压缩混淆
修改next.config.js,让SWC不对你的GraphQL相关代码(Schema、Resolvers文件)进行名称压缩:
/** @type {import('next').NextConfig} */ const nextConfig = { swcMinify: true, experimental: { swcPlugins: [ // 替换为你的GraphQL文件路径规则 ['@swc/plugin-noop', { include: ['**/graphql/**/*.ts', '**/resolvers/**/*.ts'] }] ] } }; module.exports = nextConfig;
若缺少@swc/plugin-noop,先执行安装:pnpm add @swc/plugin-noop --save-dev
3. 强制GraphQL Schema验证并保留原始类型名
构建Schema时开启严格验证,同时确保类型名不被自动压缩(适用于TypeGraphQL场景):
const schema = buildSchemaSync({ authChecker: UserAuthority, resolvers: [...], // 开启严格验证,提前发现重复类型 validate: true, // 禁用自动生成的类型名压缩 skipCheck: false });
4. 本地复现生产环境问题排查
在本地执行生产构建命令,复现问题并打印完整Schema,排查重复类型:
pnpm run build && pnpm run start
在代码中添加打印逻辑,输出Schema内容:
import { printSchema } from 'graphql'; const schema = getSchema(); console.log(printSchema(schema));
查看输出的Schema中是否存在重复定义的类型,或是被压缩后的短名称冲突。
内容的提问来源于stack exchange,提问作者meds
相关产品推荐
相关产品推荐

