我尝试实现了从Rails模式生成前端(TS, urql)类型的功能,使用了GraphQL

GraphQL是什么?

GraphQL是一种用于API的查询语言,也是用现有数据来满足这些查询的运行时。GraphQL提供了API中数据的完整且易理解的描述,使客户端能够精确地获取所需内容,并简化了API随时间演化的过程,同时还支持强大的开发者工具。

GraphQL是一种API查询语言,也是一个用于执行这些查询的运行时工具,使用现有数据。GraphQL能够提供关于API内数据的完备且易懂的描述,使得客户端能够精确地请求所需的数据,而且使得API能够轻松演进,并能够为开发者提供强大的工具支持。

总之,通过在查询语言中定义API的文档和查询,让我们能够更轻松地进行正在开发的API的更改。

GraphQL 的功能

    • graphqlドキュメントを介してフロント・バック間の分業がしやすくなる

 

    • バックエンド

DBのスキーマからgraphqlのAPI定義(ドキュメント)を自動生成できる

フロントエンド

バックエンドで自動生成したドキュメントからさらに自動で型生成することができる

可能的条件下,随着模式的变更和修订,实施成本可能会降低!!

动手实践

考虑实现获取用户的API案例。

后端

角色入场

    • graphql-ruby

 

    graphiql-rails

作为前提条件,将自动生成进行GraphQL API开发所需的文件组。

rails g graphql:install

我们将继续进行实际的API开发。这次我们来思考获取用户数据的终点。

首先,创建一个用户对象。

rails g graphql:object User

然后,将根据用户表的模式自动生成相应的GraphQL类型的代码。

查看生成的代码
.ruby
# 冻结字符串文字为真模块 类型
类 用户类型 < 基础对象的类型
字段: :id, ID, 空: 假
字段: :电子邮件, 字符串, 空: 假
# 删除不想暴露的字段
# 字段: :crypted_password, 字符串
# 字段: :salt, 字符串
字段: :已验证, 布尔值, 空: 假
字段: :删除时间, GraphQL::Types::ISO8601DateTime
字段: :姓名姓, 字符串, 空: 假
字段: :姓名中间, 字符串, 空: 假
字段: :姓名名, 字符串, 空: 假

# 关联需要自己添加(要进行N+1处理)
字段: :活动, [类型::活动类型], 空: 假
结束
结束

在 graphql/query_type.rb 文件中定义端点

field :users, [Types::UserType], null: false do
  description '全ユーザー返す'
end

def users
  User.all
end

下一步需要产生 GraphQL schema,但是标准的 rake 任务并没有这样做,所以需要自己创建。

require "graphql/rake_task"
GraphQL::RakeTask.new(schema_name: "MySchema")

自从创建了这个rake任务以来

$ rails graphql:schema:idl

敲击它会生成GraphQL文档

这是查询类型,返回所有用户信息。用户类型包括创建时间、删除时间、邮箱、ID、姓、中间名、名字和更新时间等属性。

前端

角色进入舞台

    • urql

 

    graphql-codegen

首先,我们定义查询。

export const UsersQuery = graphql(/* GraphQL query */ `
  query UserQuery {
    users {
      id,
      email,
      nameSei,
      nameMid,
      nameMei
    }
  }
`);

接下来将放置GraphQL配置文件。

import type { CodegenConfig } from '@graphql-codegen/cli'

const config: CodegenConfig = {
   schema: './schema.graphql',
   documents: ['src/**/*.{ts,tsx}'],
   generates: {
      './src/graphql': {
        preset: 'client',
        plugins: []
      }
   }
}
export default config

这样就行了

$ yarn graphql-codegen

然后会自动生成类型。(生成的类型很庞大,因此省略)

%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88_2022-10-26_15.24.36.png

下一个对策

虽然偏离了主题,但是在使用Rails和GraphQL的情况下,即使使用了includes preload也会出现N+1问题。因此,可以通过使用名为graphql-batch的库来避免N+1问题。因为以下的文章对我来说非常有用,所以我想分享一下。

 

以下是”参照”的中文本地表达,只提供一种选项:

依照

    • https://graphql.org/

 

    • https://graphql-ruby.org/

 

    • https://github.com/rmosolgo/graphiql-rails

 

    • https://formidable.com/open-source/urql/

 

    https://the-guild.dev/graphql/codegen/docs/getting-started
广告
将在 10 秒后关闭
bannerAds