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-toolsmakeExecutableSchema 从您提供的类型定义和解析器映射中实际生成服务使用的模式。传递给makeExecutableSchematypeDefs 可以是已解析的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 文件有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

gql 和 buildSchema 有啥区别?

[Apollo Server] Get started with Apollo Server

使用 graphql 和 apollo-server 在解析器中获取会话

如何使用 GQL 从 React 前端的 Apollo 客户端获取错误

通过 Apollo Server (NestJS) 处理异常

突变上未定义的参数,使用 apollo-server