Facebook 的 GraphQL 为何没有火起来?

一开始炒的很火,但看github上star数涨得很慢。国内用的人似乎也不多
圈爷     532017-11-09 23:51:47

好吧 我最近在写一个项目 正在用GraphQL写 刚入坑 只能谈一点浅浅的上手感受:

  1. 首先为什么这次要用GraphQL, 因为这次我做了一个micro services + clusters的架构,而几个services之间解耦性很高,大多数时候都是在自顾自地运行独立任务或者调度其他任务簇的工作,原本如果不用GraphQL,我是打算写一个REST的中间层,来进行 Micro Services和数据库之间的任务调度,实现micro services和数据库之间的彻底隔离,既然是有一个隔离的中间层,自然就想到GraphQL去了--------> 然后我突然意识到,使用GraphQL我连调度逻辑都不用写了,可以直接使用Subscription,当数据库外部更新的时候 Micro Services自动 update,这样 micro service整个就独立运作了!配合上容器, 简直厉害! OK,这就是美好的一面,入坑开始
  2. 缺点,我很快发现了GraphQL的几个大坑
    1. 我发现GraphQL的文档和事例真少,尤其是Production级别的,几乎没有,大多数时候还得摸索着来,效率有点低。开源库还比较混乱,官方文档里存在大量outdated或者错误的东西。
    2. GraphQL的 Schema的Types定义真心有点不习惯,要么是我思路没有转换到位,要么的确是设计有问题,举例来说,Mutation的返回类型一般是严格确定的,比如User,OK,那么如果中途Error或没有找到,只能抛出个null,WTF,写惯了REST的应该都熟悉,有时候我们得返回个Message,来告知用户到底哪里出了问题,OK,这是一点,虽然可以用Union 类来解决,但是不是默认支持,起码是不方便
    3. 再一点是异构类型,比如简单的String|Int, 目前还不支持,只能自己写Scalar 或者繁琐的写成Interface继承
    4. 再一点我觉得作为一个抽象层,GraphQL应该可以定义一些hooks来方便级联操作,不过目前也没有
    5. 最后一点 schema的三种写法,没有一种比较干净清爽,要么开两列窗口,两边对来对去,要么就忍受巨长的字符串写法,要么就得忍受大量的手写声明 没有一种对程序员比较友好。
  3. 优点,再也不用写REST的那些Path很舒服,REST最大的问题是碎片,举例,假如多个查询操作很类似,本可以抽出共用,很可能因为你的接口定义很碎,你不会发现,或者懒得一个个比对,而GraphQL所有查询修改都集中一处,很容易可以抽出能够共用的代码。再比如Authorization,以前你通常需要用middleware的方式串进所有的请求,现在直接写在context里就搞定了。总的来说,除了类型定义和Schema设计得令人厌恶外,其他都还比较令人满意。
kerry     22017-11-30 00:20:37
关于异常的问题,resolver里throw error,就不需要返回东西了,error信息会带在response的error字段里
圈爷     02018-01-30 16:44:27

目前稍微不满意的一点是 因为分成两个文件 且. graphql 文件并不是 js 文件, 所以改名字还是很烦的 一不注意容易搞错 不知道还有没有什么更好的写法

圈爷     02018-01-30 16:41:41

我初期的写法是. graphql + .js + graphqltool + merge, 应就是你说的这种写法吧, 这样的结果是长长的 flat list. 重构时引入了 graphql-resolvers 实现类似中间件的chain 效果, 来统一处理鉴权和 errors, 另外重构时所有 resolver 全部用 const 括出来了, 这样在 resolvers 文件内部可以实现相互调用.

圈爷     02018-01-30 16:33:09

可否具体一点 你现在使用的写法是怎样

taodongl     02018-01-28 00:43:58
你server是nodejs吗?看到最后一段,不太明白你的“痛点”,你是不是没用graphql-tools,用它resolver可以少写很多。
圈爷     02018-01-11 19:14:55
不是 graphql-resolver-batch 官方 dataloader也可以 实现有很多
Razertory     02018-01-11 00:30:22
敢问答主用的是不是shopify的graphql-batch库
圈爷     02018-01-10 21:53:34

graphql-batch

羅九日     02017-12-14 09:28:34
眼花缭乱的感觉
out4b     02017-12-02 13:55:04
欢迎你来看看我们的PaaS产品,全球首个JSON版的SOA解决方案:woapi.cn
Razertory     02017-12-02 10:11:02
顺带问一下,使用关系型数据库如何去避免N+1查询的
Axurez     02017-11-28 23:56:38

文档和示例真少,这是真的,官网都语焉不详,TS 类型定义倒是挺翔实的。