团队18年初开始调研并实践 GraphQL
,但是我在忙于旧项目的开发,短期并没有参与到新项目中,因此实际开始接触 GraphQL
,是在18年中旬。
18年初的新项目由于工期比较紧张,虽然说尝试了下 GraphQL
,但是其实并没有多少积累,前端只是简单地拼接查询字符串后发请求,后端也只是简单的解析了一下查询字符串,并没有将整个 GraphQL
生态中相关的工具给利用起来。
18年中旬开始接手一个使用 Go + GraphGL
来实现的新项目后端任务,后续又在几个项目中逐步实践了一下 GraphQL
在 Go
、node.js
中的使用,同时 GraphQL
在前端领域的相关工具,也尝试了不少。
GraphQL
一种用于 API
的查询语言,是一个使用基于类型系统来执行查询的服务端运行时(类型系统由你的数据定义)。
一个 GraphQL
服务是通过定义类型和类型上的字段来创建,然后给每个类型上的字段提供解析函数。
概念啥的,官网上都介绍的非常明确了,就不啰嗦了。
url
,可以通过一个 url
得到所有的数据。Schema
文件,就可以知道一个 GraphQL
服务能提供的所有能力了,省去了接口文档编写的繁琐。因为团队的后端目前正逐步在向 Go
转型,所以一开始决定在 Go
中使用 GraphQL
,Go
中的 GraphQL
库有两个:
Code-First
模式的库,无需编写 GraphQL SDL
,通过 Go
自带的结构体来描述 GraphQL
中的数据类型,由库本身来转换为 GraphQL Schema
。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
,用起来很难受。
GraphQLs
虽然说各个语言都有实现的库,但是论生态,还是在 node.js
中最好,相关的工具和库非常多。
Apollo GraphQL
提供了全套的解决方案,如果在 node.js
中使用 GraphQL
的话,建议直接使用 Apollo
。
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
is the easiest way to configure your development environment with your GraphQL schema (supported by most tools, editors & IDEs)
用来配置使用的 GraphQL
服务的地址等等信息,用于自动获取 Schema
文件。
用来管理 GraphQL
的 config
文件和 schema
文件的 CLI
工具,如果使用 IDE
的话,装上插件之后都可以在 gui
中完成,就不需要命令行工具了。
一款 Webstorm
的插件,提供了语法高亮,提示等等一系列功能,支持 graphql-config
,通过配置文件自动获取 schema
文件。
用户 mock
数据的一款工具,基于 graphql
的 schema
文件,加上特定的字段修饰,快速的运行一个假数据服务器。
类似于 GraphIQL
,也是一款 GraphQL
请求客户端,一般 GraphQL
库中都集成了一个网页版的 Playground
,便于随时查看 schema
文档和模拟请求。
类似 Postman
的一款请求客户端,但是支持 GraphQL
,同时也支持多端同步、环境变量等功能,用来测试请求很方便。