前言
GraphQL is a data query language developed internally by Facebook in 2012 before being publicly released in 2015. It provides an alternative to RESTful architectures. —— from wikipedia.
GraphQL 是 Facebook 于 2012 年在内部开发的数据查询语言,在 2015 年开源,旨在提供 RESTful 架构体系的替代方案。
GraphQL 的特性
它定义了一套类型系统(Type System),类似于持续演进(相互借鉴)的Flow和TypeScript,用来描述你的数据,先看官网的例子(细节再议)
特性
- 强类型:GraphQL与 C 和 Java 等后端语言相得益彰,服务端能对响应的形状和性质做出一定保证,而RESTful是弱类型的,缺少机器可读的元数据;
- 分工:GraphQL让服务端定义好支持哪些Queries,把对数据的Query需求下放到客户端管理,分工明确的同时保持对 API 的聚焦;
- 分层:GraphQL的Query本身是一组分层的字段,查询就像返回的数据一样,是一种产品(工程师)描述数据和需求的自然方式;(PS:部分翻译的,国外好像都把产品叫做 Product Engineers 而不是 Product Manager。感觉在吐槽的样子)
- 预测性:GraphQL的Query只返回客户端要求的内容,没有任何冗余(不浪费流量),而且它只有一个接口地址,由此衍生了另一个特性;
- 兼容性:需求变动带来的新增字段不影响老客户端,服务端再也不需要版本号了,极大简化了兼容问题;(App 通常是 1-2 周的固定周期发版,在原生应用不强制升级的世界里,会出现用户 1-2 年都不升级的情况。 这意味可能同时有 52 个版本的客户端查询我们的服务端,而在 Fackbook 中 GraphQL API 曾支持了横跨 3 年的移动端)
- 自检性:GraphQL能在执行Query之前(即在开发时)提供描述性错误消息,在给定查询的情况下,工具可以确保其句法是正确有效的,这使得构建高质量的客户端变得更加容易;
- Doc & Mock:GraphQL的文档永远和代码同步,开发无需维护散落多处的文档,调用者也无需担心过期问题,而且基于类型系统的强力支撑和 graphql-tools,mocking 会变得无比容易
生态
https://github.com/chentsulin/awesome-graphql
价值
GraphQL主要是作用于数据接口,比如前端后端交互。是给客户端筛选*获取服务端事先定义好的数据,后端使用了GraphQL之后,数据库查出来A,B,C,D四个字段,客户端需要数据的时候,你可以随意使用这四个字段的各种组合,只要A,C字段还是只要A,C,D字段等等,不再需要和服务端交流。