如何在GraphQL中导出字段定义

时间:2019-12-07 03:12:16

标签: graphql

如何在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类型。对于更大的应用程序来说,这似乎很难扩展,因为其中可能包含数十个对象和关系,突变等,并且最好在其各自的Comments文件夹,Users文件夹等中分离出单个突变。谢谢!

1 个答案:

答案 0 :(得分:3)

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

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

充其量,您可以利用模板字符串,但必须利用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对组织架构很有帮助。