Apollo Server 的 gql 标签和 schema.gql 文件有啥区别?
Posted
技术标签:
【中文标题】Apollo Server 的 gql 标签和 schema.gql 文件有啥区别?【英文标题】:What's the difference between Apollo Server's gql tag and a schema.gql file?Apollo Server 的 gql 标签和 schema.gql 文件有什么区别? 【发布时间】:2019-11-27 19:15:29 【问题描述】:Apollo Server 文档只提供了一种定义 GraphQL 模式 typeDefs 的方法,即使用 gql
标签。但是,我看到了使用schema.gql
文件的替代方法。
这些方法之一是否已过时?
使用一种方法或另一种方法有什么优点或缺点吗?
为什么 Apollo Server 文档不提及 .gql
文件类型,即使它受支持?
【问题讨论】:
【参考方案1】:ApolloServer 在后台使用来自graphql-tools
的makeExecutableSchema
从您提供的类型定义和解析器映射中实际生成服务使用的模式。传递给makeExecutableSchema
的typeDefs
可以是已解析的DocumentNode
对象(这是gql
标记产生的),也可以是字符串,在这种情况下,它们将为您解析。你也可以传入一个数组。
如果您的类型定义在一个或多个 .gql
文件(或 .graphql
或其他)中,您通常只是使用类似 fs.read
的东西将文件内容作为字符串并将其用作您的typeDefs
参数。这技术上很好,并且与使用已解析的 DocumentNode
对象一样好。
唯一的问题是,与graphql-tools
不同,apollo-server
明确为does not support this approach。这反映在模块的 TypeScript 定义中。虽然现在使用纯字符串作为 typeDefs 是可行的,但这样做可能会在未来导致一些意外行为,因此请谨慎使用。
除了上述之外,还有一个实际的原因是为您的架构使用单独的文件 - 因为有支持这些文件的编辑器插件,所以更容易利用语法突出显示和代码完成功能。还要注意指出,如果您碰巧使用 babel 转译您的代码,也可以利用 babel-plugin-import-graphql 之类的东西将您的文件导入为已解析的 DocumentNodes。
【讨论】:
好的,所以.gql
/ .graphql
文件方法确实已经过时了。我希望 Apollo Server 文档提到这一点。感谢您的信息!以上是关于Apollo Server 的 gql 标签和 schema.gql 文件有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章
[Apollo Server] Get started with Apollo Server
使用 graphql 和 apollo-server 在解析器中获取会话
如何使用 GQL 从 React 前端的 Apollo 客户端获取错误