排查lib/graphql未导出自定义Mutation/Query Hook问题
1. 先确认后端Schema是否正确暴露了自定义字段
Resolver里定义了allIssues、createIssue等方法不代表Schema已经声明了这些字段,必须确保你的GraphQL Schema(typeDefs)里明确添加了对应的Query/Mutation字段:
# 示例Schema定义 type Query { allIssues: [Issue!]! } type Mutation { createIssue(input: IssueInput!): Issue! updateIssue(id: ID!, input: IssueInput!): Issue! }
直接访问http://localhost:5555/graphql的Playground,查看「Schema」标签页,确认Query和Mutation类型下是否包含你的自定义字段。如果没有,后端Schema未正确生成,Codegen自然无法识别。
2. 修正Codegen配置中的withMutationFn参数
你的codegen.yml里设置了withMutationFn: false,这个配置会关闭typescript-react-apollo插件生成useXxxMutation这类React Hook的功能,仅生成基础类型定义。将其改为true或直接删除该配置(默认值为true):
generates: src/lib/graphql.tsx: config: # withMutationFn: false # 删掉或改为true addDocBlocks: false scalars: DateTime: string # ... 其他配置不变
3. 确保前端代码中存在对应的GraphQL操作文档
Codegen生成Hook的前提是,你的前端文件里有用gql标签定义的具体查询/变更语句。比如在issue.tsx中必须先定义:
import { gql } from '@apollo/client'; // 定义UpdateIssue的Mutation文档 const UPDATE_ISSUE_MUTATION = gql` mutation UpdateIssue($id: ID!, $input: IssueInput!) { updateIssue(id: $id, input: $input) { id title description } } `;
如果仅导入Hook但未编写对应的GraphQL操作,Codegen不会凭空生成Hook。
4. 验证Codegen的文档路径是否覆盖目标文件
检查documents配置的路径是否包含你的issue.tsx文件,确保后缀是ts/tsx,且文件中的GraphQL操作是用gql标签包裹的(Codegen默认识别该标签)。
可以添加--verbose参数运行Codegen,查看日志确认是否读取到目标文件:
graphql-codegen --verbose
5. 清理缓存并重新生成
删除已生成的src/lib/graphql.tsx文件,再重新运行Codegen命令,避免缓存导致的生成不完整问题。
内容的提问来源于stack exchange,提问作者Mel

