【问题标题】:How to export field definitions in GraphQL如何在 GraphQL 中导出字段定义
【发布时间】:2020-04-01 00:12:44
【问题描述】:

如何在 GraphQL 中导出字段定义?例如,假设我有

schema.graphql:

type Query {
  comment: String!
}

我可以这样做吗?

query.graphql:

const query = comment: String!;

export query;

schema.graphql:

import { query } from './query.graphql';

type Query {
  query
}

编辑: 这个问题背后的真正意图是如何按模式组织QuerysMutations?例如:

type Mutation {
  createComment(data: CreateCommentInput): Comment!,
  createPost(data: CreatePostInput): Post!,
  createUser(data: CreateUserInput): User!,
  deleteComment(id: ID!): Comment!,
  deletePost(id: ID!): Post!,
  deleteUser(id: ID!): User!,
}

现在我的应用程序只有三个对象:评论、帖子和用户。我的偏好是按模式(例如评论、帖子和用户)组织我的输入、解析器等,但这意味着在一天结束时我仍然必须将所有内容放入一个单一的 Mutation 类型中。对于可能有几十个对象和关系、突变等等的更大的应用程序,这似乎很难扩展,最好在它们各自的评论文件夹、用户文件夹等中分离出单独的突变。谢谢!

【问题讨论】:

    标签: graphql


    【解决方案1】:

    GraphQL 不支持任何类型的导入/导出语法。

    graphql-tagbabel-plugin-import-graphql 等某些库支持通过 cmets 导入片段或类型定义,但这些库不支持导入单个字段定义。

    充其量,您可以使用模板字符串,但您必须使用 JavaScript/TypeScript 文件(假设您使用的是 Node.js 服务器,但您的问题并不完全清楚)。

    fields.js

    export const fields = `
      comment: String!
    `
    

    query.js

    import { fields } from './fields' 
    
    export const typeDefs = `
      type Query {
        ${fields}
      }
    `
    

    不过,归根结底,您的类型定义之间不太可能有足够的重复来保证执行这样的操作。除非你有几十种类型的几十个公共字段,否则我只会处理重复。

    如果您只是想跨多个文件模块化架构,您可以使用extend 创建多个类型定义,这些类型定义将合并为一个。例如:

    type Query {
      someField: String!
    }
    
    extend type Query {
      someOtherField: String!
    }
    
    extend type Query {
      yetAnotherField: String!
    }
    

    并不是说你仍然必须定义你要扩展的类型——你不能有引用不存在的类型的扩展。然而,当使用扩展时,你的“基本”类型不一定必须有字段(只要你至少有一个扩展)。所以你也可以这样做:

    type Query # Note the lack of curly brackets
    
    extend type Query {
      someOtherField: String!
    }
    

    还有一些库,比如this one,可以让您在不使用extend 关键字的情况下合并类型定义。这种程序化合并存在一些已知问题,但 YMMV。

    最后,虽然我个人喜欢以这种方式做事,但您可能会发现 this pattern 有助于组织您的架构。

    【讨论】:

    • 谢谢!请查看我的编辑并提出其他问题。
    猜你喜欢
    • 2019-06-06
    • 2019-05-08
    • 2020-07-05
    • 2020-06-25
    • 2019-05-30
    • 2021-04-19
    • 2021-10-11
    • 2023-03-08
    • 2019-06-12
    相关资源
    最近更新 更多