如何阻止GraphQL Codegen生成的index.ts重导出以解决Next.js生产报错?
解决Next.js生产环境GraphQL Codegen重导出错误问题
问题原因
Next.js生产构建会严格校验模块导出逻辑,自动生成的index.ts中使用的export *重导出语法,可能因类型处理或潜在循环依赖触发构建错误。
方案一:禁用自动生成index.ts
直接在Codegen配置中关闭index.ts的自动生成,避免重导出问题:
import type { CodegenConfig } from '@graphql-codegen/cli'; const config: CodegenConfig = { overwrite: true, schema: 'schema.graphql', documents: 'src/**/*.graphql', generates: { 'src/pages/api/graphql/generated/': { preset: 'client', plugins: [], config: { generateIndex: false // 禁用自动生成index.ts }, }, './graphql.schema.json': { plugins: ['introspection'], }, } }; export default config;
修改后,直接从fragment-masking.ts和gql.ts文件中导入所需类型,跳过聚合导出的index.ts。
方案二:自定义脚本修复导出语法
若需要保留聚合导出的index.ts,可添加一个生成后脚本,将export *替换为类型安全的导出方式:
- 更新
package.json中的codegen脚本,添加后续处理步骤:
{ "scripts": { "codegen": "graphql-codegen && node fix-export.js" } }
- 创建
fix-export.js脚本,修改生成的index.ts内容:
const fs = require('fs'); const path = require('path'); const targetFile = path.join(__dirname, 'src/pages/api/graphql/generated/index.ts'); const fixedContent = ` import type * as FragmentMasking from './fragment-masking'; import type * as Gql from './gql'; export type { FragmentMasking, Gql }; `; fs.writeFileSync(targetFile, fixedContent.trim());
该脚本会将原始的重导出改为明确的类型导入与导出,适配Next.js生产构建的校验规则。
方案推荐
优先选择方案一,无需额外脚本维护,直接通过配置修改解决问题;若业务场景需要聚合导出,再使用方案二做后续处理。
内容的提问来源于stack exchange,提问作者AbdulGafar Olamide Ajao
相关产品推荐
相关产品推荐

