原文:Top 5 Reasons to Use GraphQL
目的
GraphQL已成为新的API开发标准。
为何仅用两年多时间,GraphQL就已走在了API开发的前沿?为何开发人员喜欢GraphQL快速开发?本文给出几个理由。
1) GraphQL API 有强类型 schema
对大多数API而言,最大的问题在于缺少强类型约束。常见场景为,后端API更新了,但文档没跟上,你没法知道新的API是干什么的,怎么用,这应该是前后端掐架的原因之一。
GraphQL schema 是每个GraphQL API的基础,它清晰的定义了每个API支持的操作,包括输入的参数和返回的内容。
GraphQL schema是一个约定,用于指明API的功能。
GraphQL schema是强类型的,可使用SDL(GraphQL Schema Definition Language)来定义。相对而言,强类型系统使开发人员自行车换摩托。比如,可以使用构建工具验证API请求,编译时检查API调用可能发生的错误,甚至可以在代码编辑器中自动完成API操作。
schema带来的另一个好处是,不用再去编写API文档——因为根据schema自动生成了,这改变了API开发的玩法。
2) 按需获取
我们经常谈GraphQL的主要优点——前端可以从API获取想要的数据,不必依赖REST端返回的固定数据结构。
如此,解决了传统REST API的两个典型问题:Overfetching和Underfetching。
使用GraphQL,前端自己决定返回的数据及结构。
Overfetching
Overfetching意味着前端得到了实际不需要的数据,这可能会造成性能和带宽浪费。
栗子:个人资料页面需要呈现用户姓名和生日;提供用户信息的API(如/users/id
)还会返回用户的地址和账单信息,但这在个人资料页面没有用,也没必要。
Underfetching
Underfetching与Overfetching想反,API返回中缺少足够的数据,这意味着前端需要请求额外的API得到需要的数据。
最坏的场景下,不足的结果会导致臭名昭著的N+1请求问题:获取数据列表,而没有API能够满足列表字段要求,不得不对每行数据发起一次请求,以获取所需数据。
栗子:假设我们在捣鼓一个博客应用。显示 user列表,除user本身信息外,还要显示每个user最近一篇文章的title。然而,调用/users/
仅得到user
集合,不得不对每个user
调用/users/<id>/articles
获取其最新文章。
说明:当然你可以再写一个API来满足特殊场景,如/users/lastarticles/
来满足上面的需求,但需要编写后端相关代码,调试和部署,加班....有这时间何不去陪家人孩子。
3) GraphQL支持快速产品开发
GraphQL使前端开发人员轻松,感谢GraphQL的前端库(Apollo、Relay或Urql),前端可以用如缓存、实时更新UI等功能。
前端开发人员生产力提高,产品开发速度加快,无论UI如何变后端不用变。
构建GraphQL API的过程大多围绕GraphQL scheme。由此,经常听到 schema-driven development(SDD),这只是指一个过程,功能在schema中定义,在resolver(解析器)中实现。
有了像GraphQL Faker这样的工具,前端开发可以在schema定义后开始。GraphQL Faker模拟整个GraphQL API(依赖于定义的schema),因此前后端可以独立工作。
4) Composing GraphQL API
schema拼接(stitching)是GraphQL中的新概念之一,简而言之,可以组合和连接多个GraphQL API,合并为一个。与React组件概念类似,一个GraphQL API可以由多个GraphQL API构成。
这对前端开发非常有用,不然,需要与多个GraphQL端点通信(通常在微服务架构或与第三方API集成时)。由于schema拼接,前端只需要处理单个API端点,而协调与各种服务通信的复杂性从前端隐藏。
5) 丰富的开源生态和牛逼闪闪的社区
自Facebook正式发布GraphQL以来,仅两年多时间,整个GraphQL生态系统的成熟程度难以置信。
刚发布时,开发人员使用GraphQL的唯一工具是graphql-js参考实现——一个Express.js中间件和GraphQL client Relay。
现在,GraphQL规范的参考实现有多种语言可以选择,并有大量的GraphQL客户端。此外许多工具提供了无缝的工作流程,并在构建GraphQL API时提供爽爽的开发体验,如:Primsa、GraphQL Faker、GraphQL Playground、graphql-config等。
GraphQL社区日益壮大,越来越多的公司将其用之于产品。
参考
- GraphQL 中文文档
- How to build a GraphQL Server with graphql-yoga
- How to GraphQL: The fullstack GraphQL tutorial
-
GraphQL boilerplates: Starter kits for GraphQL projects with Node, TypeScript, React, Vue,…
How to GraphQL
GraphQL规范