翻译:疯狂的技术宅原文:https://opensource.com/articl...
未经允许严禁转载
GraphQL是一种查询语言、一种执行引擎和一种规范,它引领开发人员重新思考应该怎样去构建客户端和API。
GraphQL 是当今软件技术领域最大的流行语之一。但它究竟是什么?它是一种像 SQL 这样的查询语言吗?像 JVM 这样的执行引擎?像 XML 这样的规范?
只有回答了以上所有问题,才是正确答案! GraphQL 是一种查询语言语法,与编程语言无关的执行引擎,以及不断发展的规范。
让我们深入了解 GraphQL 是怎样成为这些东西的,并探究人们对此感到兴奋的原因。
查询语言
GraphQL 作为一种查询语言似乎是合理的 —— 毕竟其中包含了“QL”这个字眼。但是我们在查询什么呢?下面关于查询请求和对应的响应的例子可能会对你的理解有所帮助。
以下用户查询:
{
user(id: 4) {
name
email
phoneNumber
}
}
可能会返回以下 JSON 响应:
{
"user": {
"name": "Zach Lendon"
“email”: “zach@hydrate.io”
“phoneNumber”: “867-5309”
}
}
假设客户端程序查询 user 的详细信息,然后获取结果并显示在屏幕上。作为一种查询语言,GraphQL 的核心优势之一是客户端程序只能请求其所需要的数据,并以一致的形式返回它。
但什么是返回 GraphQL 响应?这就是执行引擎(通常以GraphQL服务器的形式)的用武之地。
执行引擎
GraphQL 执行引擎负责处理 GraphQL 查询并返回 JSON 响应。所有 GraphQL 服务器都由两个核心组件组成:模式和解析器,这两个组件分别定义了执行引擎的结构和行为。
GraphQL schema 是一种自定义类型语言,它公开了 GraphQL 服务器实现允许(有效的)和处理哪些查询。上面的用户查询案例的架构可以如下所示:
type User {
name: String
email: String
phoneNumber: String
}
type Query {
user: User
}
这些 schema 定义了返回 user 数据的查询。客户端可以通过 user 查询请求 user 的所有字段,GraphQL 服务器在响应中仅返回那些字段。通过使用强类型模式,GraphQL 服务器可以验证传入的查询,以确保它们基于所定义的 schema。
一旦确定查询是有效的,则交给 GraphQL 服务器的解析器处理。解析器函数支持每个 GraphQL 类型的所有字段。user 查询的解析器如下所示:
Query: {
user(obj, args, context, info) {
return context.db.loadUserById(args.id).then(
userData => new User(userData)
)
}
}
虽然上面的例子是由 JavaScript 编写的,但 GraphQL 服务器可以用任何一种语言编写。这是因为 GraphQL 本身也是一种规范!
规范
GraphQL 规范定义了实现 GraphQL 所必须遵循的功能和特性。作为 Open Web Foundation 最终规范协议下的开放规范(目前只有 OWFa 1.0 ),技术社区有机会审查 GraphQL 的实现必须怎样做才能符合规范,并帮助制定这种语言的未来。
虽然规范对 GraphQL 的语法的说明非常的具体,例如什么是有效查询以及 schema 如何工作,但它没有规定怎样对数据进行存储和 GraphQL 服务器应该用哪种编程语言实现。这在软件领域是非常强大而且独特的 —— 它允许用任何一种编程语言去实现 GraphQL 服务器,并且客户端能够准确的了解它们的功能,因为它们是符合规范的。并且已经有了基于多种编程语言的 GraphQL 服务器实现,不仅仅是人们通常认为的 JavaScript、Java 和 C#,还有 Go、Elixir 和 Haskell 等语言。服务器的实现语言不会成为障碍 —— 不仅有许多语言的实现,而且它们都是开源的。如果你选择的语言还没有对应的实现,也可以创建自己的实现。
总结
GraphQL 是一个令人兴奋的、相对较新的开源 API。它将查询语言、执行引擎与开源规范相结合,该规范定义了 GraphQL 实现的外观和功能。
GraphQL 正在改变构建客户端和 API 应用的方式。把 GraphQL 作为自己技术堆栈的一部分,前端开发者可以自由地查询他们想要的数据,而后端开发者可以将客户端程序的需求与其后端系统架构分离。一些公司通常先构建一个位于其现有后端服务之上的 GraphQL API “层”,从而开始使用 GraphQL。这使得客户端程序可以得到他们寻求的性能和运营效率,同时允许后端团队在其系统的 GraphQL 层后面进行“改进”(如果需要的话)。通常这些改进是针对性能优化的,这将有助于确保使用 GraphQL 的程序高效地运行。由于 GraphQL 提供的抽象能力,系统团队可以在继续遵守 GraphQL API 级别的规范的前提下进行这些改进。
由于 GraphQL 相对较新,开发人员仍在不断的寻找更好的使用它的方案。 GraphQL 将如何改变你的开发方式并使你获得成功?只有一种方法——用 GraphQL 去实现一些东西!
本文首发微信公众号:前端先锋
欢迎扫描二维码关注公众号,每天都给你推送新鲜的前端技术文章
欢迎继续阅读本专栏其它高赞文章:
- 深入理解Shadow DOM v1
- 一步步教你用 WebVR 实现虚拟现实游戏
- 13个帮你提高开发效率的现代CSS框架
- 快速上手BootstrapVue
- JavaScript引擎是如何工作的?从调用栈到Promise你需要知道的一切
- WebSocket实战:在 Node 和 React 之间进行实时通信
- 关于 Git 的 20 个面试题
- 深入解析 Node.js 的 console.log
- Node.js 究竟是什么?
- 30分钟用Node.js构建一个API服务器
- Javascript的对象拷贝
- 程序员30岁前月薪达不到30K,该何去何从
- 14个最好的 JavaScript 数据可视化库
- 8 个给前端的顶级 VS Code 扩展插件
- Node.js 多线程完全指南
- 把HTML转成PDF的4个方案及实现
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。