首页 > 解决方案 > Apollo Server 的 gql 标签和 schema.gql 文件有什么区别?

问题描述

Apollo Server 文档只提供了一种定义 GraphQL 模式 typeDefs 的方法,即使用gql标签。但是,我已经看到使用schema.gql文件的替代方法。

这些方法之一是否已过时?

使用一种方法或另一种方法有什么优点或缺点吗?

.gql即使支持,为什么 Apollo Server 文档不提及文件类型?

标签: javascripttypescriptgraphqlapolloapollo-server

解决方案


ApolloServer 在后台使用makeExecutableSchemagraphql-tools您提供的类型定义和解析器映射实际生成服务使用的模式。typeDefs您传递给的可以makeExecutableSchema是已解析的DocumentNode对象(这是gql标签产生的内容),也可以是字符串,在这种情况下,将为您解析它们。您也可以传入任何一个的数组。

如果您在一个或多个.gql文件(或.graphql,或其他文件)中有类型定义,则通常只是使用类似fs.read将文件内容作为字符串获取并将其用作typeDefs参数的方法。这在技术上很好,并且与使用已解析的DocumentNode对象一样好。

唯一的问题是,不像graphql-toolsapollo-server明确地不支持这种方法。这反映在模块的 TypeScript 定义中。虽然现在使用纯字符串作为 typeDefs 是可行的,但这样做可能会导致将来出现一些意外行为,因此请谨慎操作。

除了上述之外,还有一个实际的理由为你的模式使用单独的文件——因为有支持这些文件的编辑器插件,所以更容易利用语法突出显示和代码完成。还需要注意的是,如果您碰巧使用 babel 转译您的代码,也可以利用babel-plugin-import-graphql之类的东西将您的文件作为已解析的 DocumentNodes 导入。


推荐阅读