Apollo Server 的 gql 标签和 schema.gql 文件有什么区别?

What's the difference between Apollo Server's gql tag and a schema.gql file?

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

其中一种方法过时了吗?

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

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

ApolloServer 在后台使用 graphql-tools 中的 makeExecutableSchema 从您提供的类型定义和解析器映射中实际生成服务使用的模式。您传递给 makeExecutableSchematypeDefs 可以是经过解析的 DocumentNode 对象(这是 gql 标记生成的对象),或者它们可以是字符串,在这种情况下它们将为你解析。您也可以传入一个数组。

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

问题在于,与 graphql-tools 不同,apollo-server 显式 does not support this approach。这反映在模块的 TypeScript 定义中。虽然目前使用普通字符串作为 typeDefs 可行,但这样做可能会在将来导致一些意外行为,因此请谨慎使用。

除此之外,还有一个为您的架构使用单独文件的实际原因——利用语法突出显示和 code-completion 更容易,因为有支持这些文件的编辑器插件。还需要指出的是,如果你碰巧用 babel 转译你的代码,也可以利用 babel-plugin-import-graphql 之类的东西将你的文件导入为已解析的 DocumentNodes。