tangkikodo 最近的时间轴更新
tangkikodo

tangkikodo

V2EX 第 291907 号会员,加入于 2018-02-13 14:40:00 +08:00
tangkikodo 最近回复了
@AloneHero

这段我没描述清晰, 这两个 comment count 是为了比喻某种前端视图需求, 拿到了数据之后需要做二次统计聚合, 或者干脆要自己转换一把。 “解决 gql 不擅长的后处理环节” 是 gql 不适合前后端紧耦合这个大问题下面的子问题。


------ “那是不是某个字段的逻辑有可能分散在很多字段里面?这样可维护性会不会很容易遭到破坏?”

你对 gql 很熟悉, 会想到这个问题,我猜是从 qgl 中 schema 是复用的情况下产生的疑问。在 resolve 的模式下,schema 是通过继承**核心数据**的结构, 来保证每个结构都有一套自己的描述。( pick 数据也能支持)
比如一个页面用到的 schema , 是在同级目录下按需申明出来的, 所以后处理的依赖关系挺清晰的。

比较真实的例子可以看

- https://github.com/allmonday/composition-oriented-development-pattern/blob/master/src/router/sample_1/schema.py 介绍了使用继承来“clone" schema 的做法。


我在“优势” 中说,gql 和 restuful 适合提供公共接口, 是因为公共接口往往设计合理,也不用考虑太多视图层数据的特殊展示需求。gql 根据查询来驱动的特性决定了这种后处理字段的依赖关系会造成混乱(单独查询 count 总不能暗搓搓去触发 blogs 吧),gql 构造业务向的数据,可能的后果是, 提供了 90%前端所要的结构, 但剩下 10% (不准确,比喻)涉及到后处理相关的,gql 做和前端做, 都挺麻烦的。 再加上前端需要随时跟着后端调整 query ,形成了迭代中的负担。

pydantic-resolve 的例子里面, 可以理解为, 前端描述的 query 直接固化在了后端 schema 上。

这时前端只要向 rpc 那样直接`getSiteData` 就能拿到视图数据, 如果迭代中出现需求, 需要在这个视图数据上添加额外数据,比如后处理按照层级统计 count , 或者把结构做转换, 后端都很容易,并且改完之后前端同步一下就能感知。

里面比较极端的例子就是文末彩蛋处理 tree 的层层聚合。

pydantic-resolve 的角色是扮演好防腐层, 提供各种功能来做好“数据获取和转换” 这个目的, 然后尽可能避免 service 做调整。
@qwerasdf123 这份执着也真的只能佩服
@StarkWhite 复杂度不能消灭, 只能控制。

从关注点分离的角度, 以及自己的体会来看, 这块复杂度我希望放在后端来管控
而“前端自己要做数据转换”, 这件事在前后端分离的项目中, 就是容易积累“技术债” 和 “遗留代码” 的地方。
@StarkWhite gql 本身没问题, 问题出在 gql 查询到的字段要转换成前端直接可用的结构, 往往是会有落差的。
因为后端结构相对固定, 但是前端视图数据却是各种天马行空。

如果不是具体专供的 gql 接口的话, 前端做转换的工作量一般都是存在的。
如果是专供接口的话, 那前端重写一遍 query 就有点多余。

这是我使用的一些感受~
@qwerasdf123 在项目中体验过 gql 之后,得出了这个工具,要用也是应该放在后端代理查询, 用最简洁的形式和前端做沟通。 这样如果请求有性能问题, 后端也有足够的方案来优化, 代替。

以一个个功能明确的 API 的方式, 类似 gql 查询, 但是前端不同提供描述, 如果有 ts sdk 传递类型信息会更好。

如果是 python 后端的话, 推荐一把 pydantic-resolve ,面向前后端一同迭代的场景,通过构建前端恰好可用的视图数据, 让前端专注在展现和交互功能上。
@qwerasdf123 是, 打着“不用对接” 的旗号, 其实挖了个深坑
@StarkWhite

fix

```graphql
query {
MyBlogSite {
name
blogs {
id
title
comments {
id
content
}
comment_count # comments count for blog
}
comment_count # total comments
}
}
```
@StarkWhite 两个都挺重要,sql join 负责 db 的查询,dataloader 负责 db 或者 其他远程调用。

这个 join-monster 看起来和 https://postgraphile.org/ 之类的概念很像, 从 gql 查询调用 db 查询

可是。。这不太适合直接给 client 用的, 太灵活了, 自己的项目用用倒是可以简化一些步骤。

graphql 对前端有个小麻烦,就是遇到数据层级聚合的场景, 前端要么依赖 gql-lodash, 要么自己手动拆了算。

感觉问题的本质还是,gql 或者 apijson 或者 orm 这些都是负责一层层找到数据, 不负责数据后续转换。

比如获取完数据之后做点后处理, 计算全部每个 blog comment 数量, 或者 site 所有 comment 数量

这种 gql 内部做的话, 相当于整个 node 要全部预计算完了。

query {
MyBlogSite {
name
blogs {
id
title
comments {
id
content
}
comment_count # comments count for blog
}
comment_count # total comments
}
}

当然,这些是属于某种深水区的使用困扰 :<
@StarkWhite 说到 n+1 和 dataloader 感觉现有的 在 context 里面集中初始化的写法,维护起来稍嫌麻烦, 不能放开手脚随便定义
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3300 人在线   最高记录 6543   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 17ms · UTC 12:57 · PVG 20:57 · LAX 05:57 · JFK 08:57
Developed with CodeLauncher
♥ Do have faith in what you're doing.