将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进行了适当的修改。

screenshot-localhost-8080-2019.11.14-00-23-11.png

模式文件拆分后

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

以上。

广告
将在 10 秒后关闭
bannerAds