GraphQL 有什么缺点吗?

所有关于 GraphQL 的文章都会告诉你它有多么棒,但是它有什么缺点或不足吗?谢谢你。

31237 次浏览

缺点:

  • need to learn如何设置 GraphQL。生态系统仍然在快速发展,所以您必须跟上。
  • 你需要从客户端发送查询,你可以只发送字符串,但如果你想要更舒适和缓存,你会使用客户端库-> 额外代码在你的客户端
  • 在得到结果之前,需要事先定义模式 = > 额外的工作
  • You need to have a graphql endpoint on your server => 新图书馆 that you don't know yet
  • Graphql 查询不仅仅是转到 REST 端点,而是 更多字节
  • 服务器需要执行 more processing来解析查询并验证参数

但是,这些问题不仅仅是被这些问题所反驳:

  • GraphQL 是 学起来没那么难
  • 额外的密码是 只有几 KB
  • 通过定义一个模式,您可以修复 prevent much more work afterwards错误并进行多次升级
  • 有很多人转向 GraphQL,所以有一个 丰富的生态系统开发,使用优秀的工具
  • When using persistent queries in production (replacing GraphQL queries with simply an ID and parameters), you actually send 更少的字节 than with REST
  • 传入查询的额外处理可以忽略不计
  • 提供 API 与后端的干净解耦允许对后端改进进行更快的迭代

如果你使用的是关系数据库,那么这个最大的问题就是使用的是 加入

  1. 您可以允许/不允许一些字段的事实使得连接非常重要(不简单) ,这导致了额外的查询。

  2. 此外,Graphql 中的嵌套查询会导致循环查询,并且可能导致 让服务器崩溃

  3. 限制调用的速率 变得很困难,因为现在用户可以在一次调用中触发多个查询。

提示 : 在 javascript/node 的情况下,使用 facebook 的 dataloader 来减少查询的数量

我发现了一些重要的 任何考虑使用 GraphQL 的人的担忧,到目前为止的主要观点是:

在不确定深度下查询 : GraphQL 不能在不确定深度下查询,所以如果您有一个树,并且希望在不知道深度的情况下返回一个分支,那么您必须执行一些分页操作。

具体响应结构 : 在 GraphQL 中,响应与查询的形状相匹配,因此如果需要以非常具体的结构进行响应,则必须添加一个转换层来重塑响应的形状。

网络级缓存 : 由于通常通过 HTTP (单个端点中的 POST)使用 GraphQL,因此网络级缓存变得困难。解决这个问题的一种方法是使用持久化查询。

处理文件上传 : 在 GraphQL 规范中没有关于文件上传的内容,并且变换不接受参数中的文件。要解决这个问题,可以使用其他类型的 API (比如 REST)上传文件,并将上传文件的 URL 传递给 GraphQL 变异,或者在执行上下文中注入文件,这样就可以将文件放在解析器函数中。

Unpredictable Execution: The nature of GraphQL is that you can query combining whatever fields you want but, this flexibility is not for free. There are some concerns that are good to know like Performance and N+1 Queries.

Super Simple API : 如果您的服务公开了一个非常简单的 API,GraphQL 只会增加额外的复杂性,因此一个简单的 REST API 会更好。

它每年都在变得越来越好,到目前为止,GraphQL 的 社区正在增长,因此,有更多的解决方案来解决许多以前在其他答案中强调的问题。 但是为了承认是什么阻碍了公司将所有的资源投入到 GraphQL 中,我想列出一些问题和解决方案,然后是一些未解决的问题。

  • 缓存在网络级 -正如 布鲁诺所说,它是持久查询 当然,您可以在客户端上缓存,没有人会阻止您在数据库级甚至 Redis 上使用缓存。当然,因为 GraphQL 只有一个端点,而且每个查询都是不同的——这种类型的缓存要比使用 REST 复杂得多。
  • GraphQL 中的嵌套查询导致循环查询,并可能使 服务器 -不再是一个问题与各种各样的解决方案。 其中一些在这里列出
  • 处理文件上传 -我们已经为它设置了 solutions很多

但还有几个案例可以算作劣势:

  • 样板过度 (我的意思是,对于创建例如新查询,您需要定义模式、解析器和解析器内部,以明确说明 GraphQL 如何解析内部的数据和字段,在客户端创建与该数据相关的字段的查询)
  • 错误处理 -我需要说明的是,它与 REST 的比较更相关。在 apollo这里是可能的,但是在 同时它比 REST 复杂得多
  • 身份验证和授权 ——但正如我所说的,社区正以惊人的速度增长,而且已经有了“一个 href = “ https://github.com/kkemple/Graphql-auth”rel = “ noReferrer”> 对于这个目标来说,配对 解决方案

To sum up, GraphQL is just a tool for specific goals and for sure it's not a silver bullet to all problems and of course not a replacement for REST.

拥有一个端点并公开所有数据真的很棒。我发现 GraphQL 需要考虑以下几点:

  1. Implementation of File Download / Upload gets tricky (converting to string might not be a best option for large files)
  2. 在前端和后端都有大量的样板代码和模式代码。
  3. 遵循并支持 GraphQL 规范中提供的分页。
  4. 允许自定义顺序和字段排序的优先级逻辑。例如,如果我们获取用户数据以及相关的组和角色。用户可以根据用户名、组名或角色名对数据进行多重排序。
  5. 身份验证和授权将依赖于后端框架。
  6. Ensure the backend optimization and Database support to fire single query for each graphql command might get tricky.

此外,实施后应考虑优点:

  1. Very flexible to support new items and update existing behaviour.
  2. 一旦实现,使用参数和自定义排序很容易添加条件

  3. 使用大量自定义过滤器,去掉所有需要创建的操作,例如用户可以使用 id、 name 等作为参数并执行过滤。此外,过滤器还可以应用于用户中的组。

  4. 通过创建包含所有 GraphQL 查询和变更的文件来轻松测试 API。
  5. 一旦理解了这个概念,变异就是简单易行的。
  6. 获取多深度数据的强大方法。
  7. 对 Voyager 和 GraphiQL UI 或 Playground 的支持使其易于查看和使用。
  8. 使用有效的描述方法定义架构时的文档简化。

我认为 Graphql 目前必须是后端架构的一部分,对于文件上传你仍然打一个普通的 API