如何在 GraphQL 中导出字段定义
Posted
技术标签:
【中文标题】如何在 GraphQL 中导出字段定义【英文标题】:How to export field definitions in GraphQL 【发布时间】:2020-04-01 00:12:44 【问题描述】:?例如,假设我有
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 类型中。对于可能有几十个对象和关系、突变等等的更大的应用程序,这似乎很难扩展,最好在它们各自的评论文件夹、用户文件夹等中分离出单独的突变。谢谢!
【问题讨论】:
【参考方案1】:GraphQL 不支持任何类型的导入/导出语法。
graphql-tag 和 babel-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 有助于组织您的架构。
【讨论】:
谢谢!请查看我的编辑并提出其他问题。以上是关于如何在 GraphQL 中导出字段定义的主要内容,如果未能解决你的问题,请参考以下文章