将graphql.schema进行分割
请您以母语中文进行改写,以下仅提供一种选择:
题目
我第一次接触GraphQL已经一个月了。现在应该开始慢慢地输出一些内容了。
这次是一些小资讯。
在GraphQL中,我们会在schema文件中定义查询(Query)和变更(Mutation)。
当我自己开发的时候没有问题,但是如果是多人协作开发,需要修改同一个schema文件,往往会经常出现冲突。
因此,通常(根据功能分工)我们会将schema文件分开按功能分开。
目標读者
在现场刚刚开始进行使用 GraphQL 进行开发的多人团队成员。
前提
-
- GraphQL自体の説明は無し
- gqlgen自体の説明も無し
这次我们使用了Golang作为后端,并使用了名为gqlgen的库来实现GraphQL的服务器端实现。
实践
使用GraphQL来表示将某种“商品(Item)”进行注册、检索以及“用户(User)”进行注册、检索的示例。
模式文件在分割之前
尽管未进行以生产水平为依据的考虑,但可以大致如下:
schema {
query: Query
mutation: Mutation
}
type Query {
item(id: ID!): Item
user(id: ID!): User
}
type Mutation {
createItem(input: ItemInput!): ID!
createUser(input: UserInput!): ID!
}
type Item {
id: ID!
name: String!
}
input ItemInput {
name: String!
}
type User {
id: ID!
name: String!
}
input UserInput {
name: String!
}
通过使用gqlgen在Golang服务器端自动生成代码,我尝试在Playground中进行了验证。我对resolver.go进行了适当的修改。
模式文件拆分后
GraphQL模式
将与Item和User相关的查询(Query)和变更(Mutation)移动到不同的文件中。
然而,基于graphql.schema的基础仍然需要一些定义,因此对于查询方面需要进行node的适当虚拟定义,对于变更方面需要进行noop的适当虚拟定义。
由于目前至少不使用这些定义,因此不修改由gqlgen自动生成的resolver.go文件的内容。
schema {
query: Query
mutation: Mutation
}
type Query {
node(id: ID!): String!
}
type Mutation {
noop(input: NoopInput): NoopPayload
}
input NoopInput {
clientMutationId: String
}
type NoopPayload {
clientMutationId: String
}
项目的图形化表示,以及用户的图形化表示
肝脏是关键词“extend”。
extend type Query {
item(id: ID!): Item
}
extend type Mutation {
createItem(input: ItemInput!): ID!
}
type Item {
id: ID!
name: String!
}
input ItemInput {
name: String!
}
extend type Query {
user(id: ID!): User
}
extend type Mutation {
createUser(input: UserInput!): ID!
}
type User {
id: ID!
name: String!
}
input UserInput {
name: String!
}
总结
现在,由 gqlgen 自动生成的源码仅限于 Item 和 User 部分,包括验证的结果。其内容和结果与“模式文件拆分前”相同。
这次的成果物暂且是下面这个链接:
https://github.com/sky0621/study-gqlgen/tree/0cef7df53bee43e41e58258a9399d80cf7d2e7bd/try00
以上。