团队18年初开始调研并实践 GraphQL
,但是我在忙于旧项目的开发,短期并没有参与到新项目中,因此实际开始接触 GraphQL
,是在18年中旬。
18年初的新项目由于工期比较紧张,虽然说尝试了下 GraphQL
,但是其实并没有多少积累,前端只是简单地拼接查询字符串后发请求,后端也只是简单的解析了一下查询字符串,并没有将整个 GraphQL
生态中相关的工具给利用起来。
18年中旬开始接手一个使用 Go + GraphGL
来实现的新项目后端任务,后续又在几个项目中逐步实践了一下 GraphQL
在 Go
、node.js
中的使用,同时 GraphQL
在前端领域的相关工具,也尝试了不少。
一、主要技术
GraphQL
GraphQL
一种用于 API
的查询语言,是一个使用基于类型系统来执行查询的服务端运行时(类型系统由你的数据定义)。
一个 GraphQL
服务是通过定义类型和类型上的字段来创建,然后给每个类型上的字段提供解析函数。
概念啥的,官网上都介绍的非常明确了,就不啰嗦了。
- 客户端控制需要返回哪些数据。
- 获取多个资源,只用一个请求。
- 基于类型和字段的方式进行组织,而不是通过
url
,可以通过一个url
得到所有的数据。 - 在接口描述的时候就具备了类型,明确接口的输入输出,只需要拿到
Schema
文件,就可以知道一个GraphQL
服务能提供的所有能力了,省去了接口文档编写的繁琐。
Go + GraphQL
因为团队的后端目前正逐步在向 Go
转型,所以一开始决定在 Go
中使用 GraphQL
,Go
中的 GraphQL
库有两个:
- Graphql-go/graphql:
Code-First
模式的库,无需编写GraphQL SDL
,通过Go
自带的结构体来描述GraphQL
中的数据类型,由库本身来转换为GraphQL Schema
。 - graph-gophers/graphql-go:
Schema-First
模式的库,需要先写好SDL
,然后在Go
中写相应的字段的解析函数。
关于 Code-First
、Schema-First
的区别,可以看:[The Problems of “Schema-First” GraphQL Server Development][https://www.prisma.io/blog/the-problems-of-schema-first-graphql-development-x1mn4cb0tyl3/] 这篇文章。
但是这两个库其实都只是起了一个查询字符串解析,然后调用相应的解析函数的作用,并没有完整的整合中间件等一系列功能,实际使用的时候,还是得结合某个 web
框架来使用。
之前的项目中,都是结合 gin
来使用,权限校验等等都是先通过 gin
的中间件来完成,错误处理也是 graphql
库中处理一遍,然后 gin
的中间件中再处理一遍。
使用的时候总感觉就是变相的 restful
,用起来很难受。
Node.js + GraphQL
GraphQLs
虽然说各个语言都有实现的库,但是论生态,还是在 node.js
中最好,相关的工具和库非常多。
Apollo GraphQL
提供了全套的解决方案,如果在 node.js
中使用 GraphQL
的话,建议直接使用 Apollo
。
Prisma
Prisma
是基于 GraphQL
的后端解决方案,在数据库之上,提供了一个 prisma server
用于计算层,提供 GraphQL
类型的接口用于数据查询,使得数据库在后端代码中基本是无感的,只用调用 prisma client
发起 graphql
形式的 http
请求即可。
同时 Prisma
提供了根据预先定义好的数据模型,自动生成增删改查所有接口的能力,基本上只要写好 datamodel
,一个简单的 GraphQL
后端就出来了。
在小的数据展示类项目中,可以极大的节省后端的人力,前端一人即可完成整个项目的开发。
同时 Prisma
官方的 blog
中有大量非常优质的 GraphQL
相关的文章,值得一看: [Prisma Blog][https://www.prisma.io/blog/]
二、周边工具
GraphQL
的生态非常好,周边的小工具用好了之后,可以极大的提高开发效率。
GraphQL Config
graphql-config
is the easiest way to configure your development environment with your GraphQL schema (supported by most tools, editors & IDEs)
用来配置使用的 GraphQL
服务的地址等等信息,用于自动获取 Schema
文件。
GraphQL CLI
用来管理 GraphQL
的 config
文件和 schema
文件的 CLI
工具,如果使用 IDE
的话,装上插件之后都可以在 gui
中完成,就不需要命令行工具了。
JS GraphQL
一款 Webstorm
的插件,提供了语法高亮,提示等等一系列功能,支持 graphql-config
,通过配置文件自动获取 schema
文件。
GraphQL Faker
用户 mock
数据的一款工具,基于 graphql
的 schema
文件,加上特定的字段修饰,快速的运行一个假数据服务器。
GraphQL Playground
类似于 GraphIQL
,也是一款 GraphQL
请求客户端,一般 GraphQL
库中都集成了一个网页版的 Playground
,便于随时查看 schema
文档和模拟请求。
Insomnia
类似 Postman
的一款请求客户端,但是支持 GraphQL
,同时也支持多端同步、环境变量等功能,用来测试请求很方便。