javascript - Apollo Server 的 gql 标签和 schema.gql 文件有什么区别?
问题描述
Apollo Server 文档只提供了一种定义 GraphQL 模式 typeDefs 的方法,即使用gql
标签。但是,我已经看到使用schema.gql
文件的替代方法。
这些方法之一是否已过时?
使用一种方法或另一种方法有什么优点或缺点吗?
.gql
即使支持,为什么 Apollo Server 文档不提及文件类型?
解决方案
ApolloServer 在后台使用makeExecutableSchema
从graphql-tools
您提供的类型定义和解析器映射实际生成服务使用的模式。typeDefs
您传递给的可以makeExecutableSchema
是已解析的DocumentNode
对象(这是gql
标签产生的内容),也可以是字符串,在这种情况下,将为您解析它们。您也可以传入任何一个的数组。
如果您在一个或多个.gql
文件(或.graphql
,或其他文件)中有类型定义,则通常只是使用类似fs.read
将文件内容作为字符串获取并将其用作typeDefs
参数的方法。这在技术上很好,并且与使用已解析的DocumentNode
对象一样好。
唯一的问题是,不像graphql-tools
,apollo-server
明确地不支持这种方法。这反映在模块的 TypeScript 定义中。虽然现在使用纯字符串作为 typeDefs 是可行的,但这样做可能会导致将来出现一些意外行为,因此请谨慎操作。
除了上述之外,还有一个实际的理由为你的模式使用单独的文件——因为有支持这些文件的编辑器插件,所以更容易利用语法突出显示和代码完成。还需要注意的是,如果您碰巧使用 babel 转译您的代码,也可以利用babel-plugin-import-graphql之类的东西将您的文件作为已解析的 DocumentNodes 导入。
推荐阅读
- javascript - 这种合并排序的迭代实现是否正确?
- angular - “可观察”类型上不存在属性“地图”
' - java - 如果缺少 jar,使用“jpackage”创建的可执行文件会静默失败
- c# - 我的 Xaml cs 文件找不到我的 xaml 文本框 UWP
- bash - 在 bash 中回显的函数中返回值
- rstudio - Rstudio:鼠标跟随焦点?
- amazon-web-services - 避免在 AWS Lambda 中花费等待时间
- c++ - 与 Rust 的 include_str 等效的 C++ 宏
- flutter - 为什么颤动中的文本小部件不显示字母和数字的组合
- python - 迭代/循环所有列