浅谈GraphQL的尴尬

本人某校大二学生,最近忙于数据库课设,其中用到了 GraphQL,碰巧在知乎上看到了GraphQL 为何没有火起来?这个问题,虽然是刚用到 GraphQL,但对于这个问题还是有一点想法,的所以这里就浅浅的聊一下 GraphQL 的尴尬吧。

GraphQL 的好处

因为刚开始用上,没有很深入的去研究 GraphQL 的好处,我只能列出在使用过程中发现的一些好处:

弹性 API 查询

由前端传来的查询参数,需要哪些内容由由前端决定,可多可少,减少返回数据冗余。直接好处就是对于不同的 C 端(Web、App、小程序等),可能需要展示不同的内容,有的数据需要,有的数据不需要,使用 GraphQL 可以不用改后端代码,定制想要的数据字段。

减少路由

RESTful 往往会使用到许多路由,服务器对大量路由的解析会延长响应时间,对于 GraphQL,只需要设置一个路由而不需要大量的路由解析,并且方便 API 的管理。

减少请求次数

根据上面所说的,我们只需要一个路由,并且可以自定义需要的数据字段,那么对于一个页面,完全可以只发送一个请求来获取所有数据。

更少的代码

这是对于服务端来说的,对于查询同一内容,不需要重新再写一遍,只需要一个 resolver 就行了。

更好的前后端联调

在开发前期,只要后端给出 GraphQL 接口或者说 Schema 确定,那么在前端就能够通过 GraphQL PlayGround 很轻松的模拟数据,GraphQL PlayGround 就相当于一份 API 文档。而且因为 GraphQL 严格的类型系统,也直接在开发阶段解决掉了类型不相同的问题。

GraphQL 现状

我认为现在 GraphQL 目前处在一种进退两难的局面之中,2015 年 GraphQL 正式发布,到现在仅仅 5 年的时间,在圈子中颇具影响力,也获得了很多的关注,可以算得上是新秀。这势头太强劲,是导致 GraphQL 现在窘境的一个原因,如果它发展的慢一点,人们可以慢慢的接受,和现在是不一样的局面吧。

首先要肯定的是 GraphQL 必定会成为未来的 API 查询语言,所以人们炒的很火,但在短期内无法改变仍然开发 RESTful 的局面,这就是发展太快带来的窘境吧。明明很强,大家也很喜欢,但用的人不多,作为 GraphQL 表示很尴尬啊。

原因

一个很现实的问题就是,如果一个公司全部都是使用的 RESTful,现在改为使用 GraphQL,那不是要重写了?这对于一个大公司来说是伤筋动骨的事,搞不好服务崩溃,所以对于这些公司来说,继续使用 RESTful 花销会比改用 GraphQL 低得多,GraphQL 带来的好处远不如这些花销。

有些人认为需要前后端都支持是 GraphQL 没有被大量用起来的一个原因,但我对这个说法是不认可的,有需求就有技术支持,究其原因还是上面说的,有需求但没有必要。

兼容方案

为了解决上面这个问题,也有一些兼容性方案。

在课设项目的开发中我使用的是ApolloServer,其中 ApolloServer 提供了两类数据源,一类是 RESTful API 数据源,一类是自定义数据源,RESTful API 数据源允许你不改变 RESTful API 来使用 GraphQL 进行查询,虽然看起来是很友好的,但当你使用 GraphQL 查询的内容令一个 RESTful API 不能完整提供的时候,会带来一些问题,举个简单的例子:

RESTful API 请求的字段都是固定的,前后端设定一致,就是说客户端直接请求 RESTful API,返回的数据中冗余很少,而 GraphQL 查询中需要的内容由前端来定,往往一个 GraphQL 查询会伴随着多个 RESTful API 请求,而最终是不需要用到所有数据的,这就出现了数据冗余,浪费了资源。

而如果 RESTful API 请求和 GraphQL 查询的内容完全吻合,那相比于直接使用 RESTful API 请求,使用 GraphQL 查询多了一次请求,这就是鸡肋的存在啊。

所以我认为这种兼容并不是完美的,反而会带来更多的资源消耗,并没有达到让大家迁移到 GraphQL 的目的。

以上就是入门级码农对 GraphQL 尴尬境地的浅显描述。如果大家有什么想法,欢迎留言评论。

评论

Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×