专栏首页京程一灯这才是GraphQL最详细的解释[每日前端夜话0x80]

这才是GraphQL最详细的解释[每日前端夜话0x80]

翻译:疯狂的技术宅

来源:opensource

GraphQL是一种查询语言、一种执行引擎和一种规范,它引领开发人员重新思考应该怎样去构建客户端和API。

图片来源: JuralMin, CC0. Modified by Jason Baker.

GraphQL 是当今软件技术领域最大的流行语之一。但它究竟是什么?它是一种像 SQL 这样的查询语言吗?像 JVM 这样的执行引擎?像 XML 这样的规范?

只有回答了以上所有问题,才是正确答案! GraphQL 是一种查询语言语法,与编程语言无关的执行引擎,以及不断发展的规范。

让我们深入了解 GraphQL 是怎样成为这些东西的,并探究人们对此感到兴奋的原因。

查询语言

GraphQL 作为一种查询语言似乎是合理的 —— 毕竟其中包含了“QL”这个字眼。但是我们在查询什么呢?下面关于查询请求和对应的响应的例子可能会对你的理解有所帮助。

以下用户查询:

1{
2 user(id: 4) {
3   name
4   email
5   phoneNumber
6 }
7}

可能会返回以下 JSON 响应:

1{
2 "user": {
3   "name": "Zach Lendon"
4   “email”: “zach@hydrate.io”
5   “phoneNumber”: “867-5309”
6 }
7}

假设客户端程序查询 user 的详细信息,然后获取结果并显示在屏幕上。作为一种查询语言,GraphQL 的核心优势之一是客户端程序只能请求其所需要的数据,并以一致的形式返回它。

什么是返回 GraphQL 响应?这就是执行引擎(通常以GraphQL服务器的形式)的用武之地。

执行引擎

GraphQL执行引擎

GraphQL 执行引擎负责处理 GraphQL 查询并返回 JSON 响应。所有 GraphQL 服务器都由两个核心组件组成:模式和解析器,这两个组件分别定义了执行引擎的结构和行为。

GraphQL schema 是一种自定义类型语言,它公开了 GraphQL 服务器实现允许(有效的)和处理哪些查询。上面的用户查询案例的架构可以如下所示:

1type User {
2        name: String
3        email: String
4        phoneNumber: String
5}
6
7type Query {
8        user: User
9}

这些 schema 定义了返回 user 数据的查询。客户端可以通过 user 查询请求 user 的所有字段,GraphQL 服务器在响应中仅返回那些字段。通过使用强类型模式,GraphQL 服务器可以验证传入的查询,以确保它们基于所定义的 schema。

一旦确定查询是有效的,则交给 GraphQL 服务器的解析器处理。解析器函数支持每个 GraphQL 类型的所有字段。user 查询的解析器如下所示:

1Query: {
2  user(obj, args, context, info) {
3    return context.db.loadUserById(args.id).then(
4      userData => new User(userData)
5    )
6  }
7}

虽然上面的例子是由 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 去实现一些东西!

原文:https://opensource.com/article/19/6/what-is-graphql

图书推荐

下面夹杂一些私货:也许你和高薪之间只差这一张图

2019年京程一灯课程体系上新,这是我们第一次将全部课程列表对外开放。

愿你有个好前程,愿你月薪30K。我们是认真的 !

本文分享自微信公众号 - 前端先锋(jingchengyideng),作者:疯狂的技术宅

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-06-06

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 安息吧 REST API,GraphQL 长存

    即使与 REST API 打交道这么多年,当我第一次了解到 GraphQL 和它试图解决的问题时,我还是禁不住把本文的标题发在了 Twitter 上。

    疯狂的技术宅
  • Coursera 的 GraphQL 之旅

    Coursera 的客户端开发人员钟情于 GraphQL 的灵活性,类型安全性和良好的社区支持,我们对 GraphQL 的喜爱众~所~周~知。然而,我们并没有过...

    疯狂的技术宅
  • 在 Node.js 中转换 SVG 图像格式[每日前端夜话0xAD]

    你需要将SVG文件转换为PNG、JPEG、TIFF、WEBP 和 HEIF 格式吗?本文将指导你如何转换为所有这些类型的格式。

    疯狂的技术宅
  • 以太坊中GraphQL简介及使用

    以太坊在去年升级的go-ethereum(geth)1.9.0大版本,除了性能得到大幅提升之外,引入了GraphQL,一种节点接口查询机制,用以补充JSON-R...

    Tiny熊
  • GraphQL-BFF:微服务背景下的前后端数据交互方案

    随着多终端、多平台、多业务形态、多技术选型等各方面的发展,前后端的数据交互,日益复杂。

    Nealyang
  • 干货 | 万字长文全面解析GraphQL,携程微服务背景下的前后端数据交互方案

    古映杰,携程研发高级经理,负责前端框架和基础设施的设计、研发与维护。开源项目react-lite和react-imvc作者。

    携程技术
  • GraphQL-BFF:微服务背景下的前后端数据交互方案

    随着多终端、多平台、多业务形态、多技术选型等各方面的发展,前后端的数据交互,日益复杂。

    五月君
  • Meteor开发指南 — 响应式GraphQL

    时见疏星
  • 30分钟理解GraphQL核心概念

    在上一篇文章RPC vs REST vs GraphQL中,对于这三者的优缺点进行了比较宏观的对比,而且我们也会发现,一般比较简单的项目其实并不需要GraphQ...

    littlelyon
  • GraphQL测试实践

    我们很熟悉以REST实现的API,可以用任何能够发出http 请求的库或者工具来测试REST API。去年随着GraphQL在全球风靡,它也出现在了最近两期的T...

    ThoughtWorks

扫码关注云+社区

领取腾讯云代金券