[心得] 为什么要学 GraphQL?

楼主: appleboy46 (小恶魔)   2020-06-20 14:37:36
来聊个简单的议题? ‘为什么要学 GraphQL?’
部落格好读版: https://bit.ly/why-is-graphql
身为网站工程师,您不能不知道什么是 GraphQL,这是一个前端跟后端沟通的 API
Query 语法,大幅改善了前后端的合作模式,这篇会跟大家介绍为什麽麽要学 GraphQL,
以及整理出三大 GraphQL 优势,让大家了解跟传统 Restful API 有什么不同。当然不是
叫开发者舍弃 Restful API,而是根据专案的不同,来决定不同的技术 Stack。像是服务
跟服务之前您说要用 GraphQL,肯定被打枪,而是要用更轻量的 Restful API 或 GRPC。
好了,底下来说明三点 GraphQL 的优势。
影片: https://www.youtube.com/watch?v=00NKSvAraLQ
01:36 一次连线拿回前端所需资料
04:07 根据不同画面拿不同字段资料
06:06 即时 API 文件
1. 一次连线拿回前端所需资料
GraphQL 可以直接将 Query 语法写在一起送到后端,后端全部处理完成后再一次回给前
端,大幅降低 connection 次数。
2. 根据不同画面拿不同字段资料
在 Restful API 世界里,后端会一次回传所有资料,不会管前端需不需要这字段,也就
是前端没有权力决定该拿什么字段,这样会造成很多不必要的网络传输。Restful API
也可以根据不同画面回不同的字段资讯,却造成后端很大的负担。这时候用 GraphQL 解
决了此问题,只要在 Query 语法内定义好要拿的资料即可。
3. 即时 API 文件
大家应该都知道文件没有一天是即时更新的,写 Restful API 要求后端也补上文件,简
直是难上加难,专案在赶的时候,谁还在管文件有没有到最新,这边就要推荐 GraphQL
了,因为只要程式码一动,开发者透过 Client 工具就可以即时知道现在的 API 文件。
作者: hegemon (hegemon)   2020-06-20 14:59:00
广告文又来了除了第一点以外其他两项REST也做得到
作者: lerdor (Lerdor)   2020-06-20 15:06:00
针对第一点询问一下,这个成立的条件是在query的input相同?
作者: sp063439 (Isk)   2020-06-20 15:24:00
推推
作者: shingatter (睡猪)   2020-06-20 15:41:00
同问第一题
作者: mystery7631 (超潮设计师)   2020-06-20 15:59:00
怎么没说graphQL文件和规则像大便
作者: jobintan (Robin Artemstein)   2020-06-20 16:26:00
当初因为玩Gatsby.JS,所以顺道学了GrapghQL。
楼主: appleboy46 (小恶魔)   2020-06-20 16:29:00
@lerdor 你可以把多个 query 语法写在一起blog 里面有范例,可以参考看看,就大概知道了@mystery7631 也不是没遇过雷 XD
作者: stupid0319 (征女友)   2020-06-20 16:39:00
还是传统md档最好用
作者: ray9592197 (鸡排要切不要香菜)   2020-06-20 16:57:00
不觉得graph那么神,黑名单白名单订一订就订死你
作者: BlacksPig (Black Handsome s Pig)   2020-06-20 18:00:00
没办法做conn pool?
作者: s06yji3 (阿南)   2020-06-20 18:05:00
小弟不才,REST API有办法做conn pool 吗?
楼主: appleboy46 (小恶魔)   2020-06-20 18:08:00
作者: roccqqck (ccqq)   2020-06-20 18:35:00
这是宗教问题
作者: askaleroux (FalconTW)   2020-06-20 19:55:00
Swagger配Rest不行吗?
作者: bheegrl   2020-06-20 20:22:00
query语法送到后端啊...听起来就很雷的感觉https://ithelp.ithome.com.tw/articles/10208008没用好就injection吃到饱
作者: x000032001 (版废了该走了)   2020-06-20 20:24:00
swagger跟graphql就相当于手动更新和自动更新
楼主: appleboy46 (小恶魔)   2020-06-20 20:34:00
Size Limiting, Query Whitelisting, Depth Limiting这些都是需要自己再额外控制,增加 GraphQL 安全性 ..
作者: sharku (明珠求瑕)   2020-06-20 21:18:00
为何不直接写后端swagger可以随code更新 难道你还手动维护 json or yml?
作者: xlf (Cote rocks!)   2020-06-20 21:55:00
同意前面说的 实在很难做auth
作者: x000032001 (版废了该走了)   2020-06-20 22:02:00
你还是要用codegen做 而graphql可以直接查schema真妙 推文都在守着RESTful 没人想讨论graph带来的可能
作者: s24601 (ss)   2020-06-20 22:10:00
请问swagger怎么随code更新
作者: sharku (明珠求瑕)   2020-06-20 22:10:00
本文123点都不是graphql特有的优点 想推广也不是用这些
作者: zeroshine (rain)   2020-06-20 22:22:00
官网特色就说得够清楚了 https://graphql.org/原 po 也没有说错啊 不知道大家在砲轰什么
作者: a8989332 (天创)   2020-06-20 22:24:00
文人相轻的日常
作者: zeroshine (rain)   2020-06-20 22:25:00
graphql 真的让串 api 的复用变得相当的简单
作者: okd (...)   2020-06-20 22:25:00
推一个 有内容可以讨论 不太明白在嘘什么
作者: zeroshine (rain)   2020-06-20 22:26:00
甚至在 react apollo 的帮助下 整个 component 装下去资料也会顺便拉好后端工程师懒得帮你做资料转换 过滤 都可以让你在 gql上做好甚至可以用 directive 让这些逻辑应用在各个字段上
作者: sharku (明珠求瑕)   2020-06-20 22:54:00
像楼上几位提的几点还比较有推广到
作者: sojoasd (sojo)   2020-06-21 00:27:00
GraphQL 针对 query 来说,考量拿到什么字段,这倒是小事,比较要注意的是字段往下延伸时,有没有使用 dataloader 协助处理,否则db 查询会搞爆 server
作者: SIMD (丹丹指令流)   2020-06-21 00:44:00
谁没文件在开发,先讨论好文件才开发吧
作者: jinmin88 (昼伏夜出)   2020-06-21 01:36:00
swagger表示 我被当塑胶
作者: bibo9901 (function(){})()   2020-06-21 05:48:00
GraphQL就相当把后端结构完全泄漏给前端
作者: Starcraft2 (来自星海的你)   2020-06-21 06:48:00
https://reurl.cc/z8GOQk 还是要看实际应用和需求
作者: knives   2020-06-21 07:24:00
graphql就是垃圾,就是个前端很爽,后端很干的概念
作者: b85040312 (万年newman)   2020-06-21 10:02:00
后端为什么很干
作者: mychiux413 (小邱)   2020-06-21 11:48:00
我用Go+GraphQL+Apollo(TS),用了就回不去了
楼主: appleboy46 (小恶魔)   2020-06-21 11:48:00
@knives 什么是后端很干的概念?
作者: bibo9901 (function(){})()   2020-06-21 15:00:00
GraphQL和直接开SQL给前端有什么本质上的差别?完全失去封装的意义.
作者: lerdor (Lerdor)   2020-06-21 15:29:00
我想询问的是第一点下,若要组装A跟B的query但是他们的input也分别是C跟D还可以成立吗?
作者: neo5277 (I am an agent of chaos)   2020-06-21 15:31:00
就后端多一层就好了
楼主: appleboy46 (小恶魔)   2020-06-21 15:36:00
@lerdor 可以吧,所有的 Query 都由 Client 自行组装
作者: zeroshine (rain)   2020-06-21 16:40:00
例如说电商的商品资料在 mobile view 可能只需要 a b c字段 在 desktop web 下可能会需要 b c d e f 字段graphql 就提供 quary language 让开发者可以 specify所需要的资料字段 而不会有 over fetch 的问题也不需要让后端为各个不同的需求写不同的 end point的确 restful 可以利用带参数来完成这种需求 但这就需要工程师自己弄 也没有 graqhql 的 query 来的容易
作者: DendiQ (貔貅)   2020-06-21 16:47:00
不懂为啥说GraphQL跟直接开SQL给前端一样
作者: jaspreme206 (handsssssome)   2020-06-21 18:35:00
不懂GQL 的优势 还出来带风向 推文水准差矣
作者: paint (有斑纹的马)   2020-06-21 20:48:00
最近有用 GraphQL 真心好用
作者: PretenderY   2020-06-21 21:48:00
GraphQL最大的特点就是单一的Endpoint跟Type system
作者: dreamnook (亚龙)   2020-06-22 00:00:00
同样不懂哪里跟直接开SQL给前端相同
作者: marc47 (思乐冰)   2020-06-23 00:43:00
推用心整理
作者: vacuum (可有可无的影子)   2020-06-23 15:36:00
大概是怕学新技术的老人看了很气
作者: lestibournes (Hello World)   2020-06-24 22:20:00
推,等等消化一下xD
作者: rodion (r-kan/reminder)   2020-06-29 10:58:00
刚看了下 可以说GraphQL非但没有破坏封装 反而是增加新的封装 是说 GraphQL是对后端SQL(或其他DB)的封装也因此 若应用于不适合的情景 可能会有过度封装/增加不必要复杂度之虞或许可以这样说 已经简单易懂够高效的RestAPI 改成GraphQL是没啥意义的事情 甚至作茧自缚

Links booklink

Contact Us: admin [ a t ] ucptt.com