如何在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
}
编辑:
这个问题的真正目的是如何按照模式组织Querys
或Mutations
?例如:
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文件夹等中分离出单个突变。谢谢!
答案 0 :(得分:3)
GraphQL不支持任何类型的导入/导出语法。
某些graphql-tag和babel-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对组织架构很有帮助。