react中优雅的使用GraphQL

2,716 阅读2分钟

前言

公司中使用的是GraphQL接口,并且有相应的接口管理平台。工作中,调用接口的流程是:

  1. 在接口管理平台中找到对应的接口
  2. 将该接口的schema复制到querier.graphqlmutations.graphql
  3. 执行yarn codegen,就会自动生成react hooks风格代码

通过这种方式调用graphql接口,笔者认为比较便捷且优雅。所以特意研究了这种方式,发现其核心是通过graphql-code-generator,生成react hooks风格的代码。

对比

1.通常调用方式

normal-style.png

2.调用graphql-code-generator生成的hooks方式

codegen-style.png 可能有小伙伴好奇'../generated/graphql.tsx',这个文件是哪来的。其实这个就是graphql-code-generator自动生成的文件。

我们来看一下,生成的graphql.tsx中的部分代码: generated.png 可以发现,hooks的调用方式之所以简洁,是因为需要定义的gql自动帮我们生成了,并且定义好了useAuthorQuery hook。还有也自动生成了Author type类型。

我们总结出使用graphql-code-generator的几个优点:

  • 不需要定义gql,代码更加简洁
  • 直接使用hooks方式,代码更加优雅
  • 自动生成Typescript类型,体验更加友好

实战

我们来看一下项目中如何使用graphql-code-generator。这里就以React为例,当然也支持VueAngular等项目。

1.安装graphql-code-generator命令行工具
yarn add graphql
yarn add -D @graphql-codegen/cli
2.安装生成hooks风格的plugins

这一步可以根据实际项目情况安装对应的plugins

yarn add @graphql-codegen/typescript-react-apollo
yarn add @graphql-codegen/typescript
yarn add @graphql-codegen/typescript-operations
3.编写项目中需要生成的接口

query queries.png mutation

mutations.png

4.编写graphql-code-generator配置文件

yml.png overwrite - 生成代码时覆盖文件的标志(true默认情况下) schema(必需) - 指向GraphQLSchema,可以通过本地文件路径、url等多种方式 documents - 指向你的GraphQL文档:query、 mutation、subscription、fragment generates(必需) - 一个映射,其中键表示生成代码的输出路径,值表示该特定文件的一组相关选项:

  • generates.plugins(必需) - 生成文件时要使用的插件列表
5.配置package.json scripts
{
  "scripts": {
    "codegen": "graphql-codegen"
  },
}

到这一步,配置基本上全部完成了。只需要执行yarn codegen,就会自动生成graphql代码

6.生成的graphql完整代码

generate.png