GraphQL 快速入门:一本全面的指南

GraphQL 是一种新型的 API 查询语言,用于构建灵活、高效、可靠的应用程序。它是由 Facebook 开发的并在 2015 年开源,逐渐在全球范围内得到了广泛的应用。

本文将介绍 GraphQL 的基本概念和特点,提供全面的入门指南,并附带示例代码,目的是帮助读者快速掌握 GraphQL,提高 Web 开发效率。

什么是 GraphQL?

GraphQL 是一种由 Facebook 开发的数据查询和操作语言,通过定义灵活且可伸缩的数据查询 API 接口来取代 RESTful API 接口。它通过一个统一的 API 去解决传统 API 的局限性。

传统的 RESTful API,每个端点都对应一个请求,一个请求对应一个响应,而且响应数据与请求参数之间没有明确的联系。而 GraphQL 的 API 接口允许我们设计出从客户端角度来看完美的数据模型,从而大大减轻了客户端和服务端之间的信息处理负担。

GraphQL 的核心优势就是高效、灵活和可伸缩。它允许客户端进行复杂、多层次的数据查询和操作,在保证性能与可扩展性的同时提供了更好的用户体验。

GraphQL 的核心概念

Schema

在 GraphQL 中,Schema 是定义数据模型和属性的核心。它定义了所有可查询的字段、属性、类型和查询操作,并提供了完整的查询文档。Schema 是 GraphQL API 的中心,客户端可以通过查询文档了解如何查询需要的数据。一个 API 会对应一个 Schema。

以下是一个 Schema 定义示例:

---- ----- -
  ------------ ----- --------
  ---------- ----------
-

---- -------- -
  --- ---
  ----- ------
  ---- ---
  -------- -------
-

---- ------- -
  ----- -------
  ------- ------
-

在这个 Schema 中,我们定义了 Query 数据模型和 Customer 数据模型,Query 上暴露了两个查询操作:根据 id 查询一条 Customer 记录,和查询所有 Customer 记录。Customer 模型有 idnameageaddress 属性,address 属性是一个 Address 模型类型。

Query

在 GraphQL 中,一个 Query 就是对数据进行查询的操作。通过 Query,我们可以请求 API返回一个特定形式的数据。

以下是一个 Query 的定义示例:

-
  ------------ -- -
    ----
    ------- -
      ----
    -
  -
-

该 Query 表示请求服务器返回 id 为 1 的 Customer 记录的 name,以及该记录的 address.city 字段值。

Mutation

Mutation 是指修改、删除、插入等操作。Mutation 和 Query 的不同之处在于它更改数据,因此使用 Mutation 的请求必须要进行身份验证和授权。

以下是一个 Mutation 的定义示例:

-------- -
  ----------------- ------ ---- --- -
    --
    ----
    ---
  -
-

该 Mutation 表示向 API 添加一条名字为 Tom,年龄为 26 的新 Customer 记录。服务器会返回该 Customer 记录的 idnameage 值。

Subscription

Subscription 是指对于某些数据进行订阅和监听,它可以实时返回相关数据的变动情况。

以下是一个 Subscription 的定义示例:

------------ -
  ----------- -
    --
    ----
  -
-

该 Subscription 表示订阅服务器上新添加的 Customer 记录。每当有新的 Customer 记录添加到数据库中时,会返回该记录的 idname 字段值。

GraphQL 的优势

查询粒度更细

GraphQL 是一种面向数据层的查询语言,旨在为客户端提供一种更灵活的数据访问方式。在 GraphQL 中,客户端可以自由地指定查询的数据,可以查询或者单独修改数据中的某个字段或者只针对一个数据记录指定特定属性的值,而无需向服务器请求整个记录的内容。

没有过多 API 额外操作

在传统的 RESTful API 中,如果我们想在客户端请求多个数据记录,我们通常需要发送多个 HTTP 请求。而在 GraphQL 中,我们可以在一个单一的请求中一次性请求多个数据,并且查询文档定义的数据集非常可扩展,这大大减少了 API 操作的数量以及对 API 的负载。

前端与后端分离

GraphQL API 接口提供的 Schema 包含了所有用户可以查询的数据信息以及操作,因此前端可以方便地在不了解底层实现的情况下构建完整的数据模型。这样使得前端和后端分离,让前端团队和后端团队各自负责和掌控好自己的部分,大大提高了开发团队的效率。

GraphQL 示例代码

以下是一个基本的 GraphQL 示例代码,它定义了一个 schema.graphql 文件

-- -------------- --
---- ---- -
  ------ ------
  ------- ------
  ----- ---
-

---- ----- -
  ------ ------
-

-- ---------- --
--
  -------- ---- -----------
  --------- ------ --------
  ------- ----
--
-
  -------- ---- --------
  --------- ------- ---------
  ------- ----
--
-
  -------- ---- -- ----- ------
  --------- ---- -------
  ------- ----
--

-- ----------- --
----- ----- - -----------------------

----- --------- - -
  ------ -
    ------ -- -- -----
  -
-

-------------- - ----------

在这个示例中,我们定义了一个 Book 模型,其包含 titleauthoryear 三个字段。我们还定义了一个名为 Query 的类型,该类型定义了一个 books 查询操作,用于获取所有图书记录。在 resolver.js 文件中,我们返回已经定义好的数据源。所有数据都从 books.json 文件中获取,然后由 resolvers.js 负责将数据返回给客户端。

使用 GraphQL 需要一个服务器接收用户请求,传递请求到 resolver.js 文件进行处理,demo-http-graphql 简化了使用过程,只需要在命令行执行 index.js 即可。可以通过 http://localhost:4000/graphql 访问 GraphQL Playground 进行测试。(注意:需要在本地先安装 graphqlexpress 包)

----- - ----------- - - ---------------------------
----- ------- - -------------------
----- ------------- - ----------------------------
----- --------------- - -------------------------

----- --- - ----------

------------------- -------------
  ------- --------------
  ---------- ----------------
  --------- -----
----

---------------- -- -- -
  ---------------------- -- -------------------------
---

总结

本文介绍了 GraphQL 的基本概念和特点,以及详细的示例代码。在使用 GraphQL 时,要注意 Schema 的定义,QueryBuilder 的构造和 Resolver 的实现,这三个步骤构成了整个 GraphQL 查询请求的基础框架。

作为一种全新的 API 查询语言,GraphQL 具有很多优点,如可伸缩的查询操作、精细的查询粒度、前后端分离、减少 API 增强等等。因此,使用 GraphQL 可以大大提高数据操作效率,促进 Web 应用程序的发展。熟练掌握 GraphQL 技术是每位前端开发人员的必修技能。

来源:JavaScript中文网 ,转载请联系管理员! 本文地址:https://www.javascriptcn.com/post/645c8e8b968c7c53b0ef8c5e


猜你喜欢

  • CSS Reset 如何避免样式丢失问题

    什么是 CSS Reset 在我们开始学习如何避免样式丢失问题之前,首先我们需要了解什么是 CSS Reset。 CSS Reset 是一段 CSS 代码片段,旨在消除浏览器默认样式和行为的影响,使 ...

    1 年前
  • Serverless 应用中的数据流处理技术探索

    前言 在 Serverless 应用中,数据流处理是一个重要的技术领域。这涉及到消息传递、数据流转换、大数据计算等问题。本文将介绍 Serverless 应用中的数据流处理技术,包括其原理、应用场景、...

    1 年前
  • Socket.io 客户端与服务端的通信过程详解

    Socket.io 是一个面向浏览器和服务器的实时数据通信库,它可以让我们通过 WebSocket、轮询等多种方式进行双向通信。在前端开发中,Socket.io 经常用于实现实时通知、聊天室、游戏等功...

    1 年前
  • 使用 Enzyme 测试 React 组件(二)

    在上一篇文章中,我们已经了解了何为 Enzyme,以及它是如何帮助我们测试 React 组件的。在这篇文章中,我们将继续深入探讨如何使用 Enzyme 进行 React 组件测试,包括组件渲染、交互事...

    1 年前
  • Mongoose 中使用 ObjectId 类型的方法详解

    在 MongoDB 中,每个文档都有一个唯一的 _id 属性,其可以用作主键,也可以根据其在索引中的位置进行排序。在 Mongoose 中,可以使用 ObjectId 类型来表示 _id 属性,它是一...

    1 年前
  • ES7 最新手册:Symbol 类型

    在 ECMAScript 2015 (ES6)草案中,Symbol 是一种新的基本数据类型,用于表示一个独一无二的标识符。它的出现使得我们可以创建真正意义上的私有成员和方法,而不是依靠一些 hack ...

    1 年前
  • RxJS 中的 concat 操作符详解

    在 RxJS 中,concat 操作符用于将多个 Observables 顺序地连接起来,类似于 JavaScript 数组中的 concat 方法。通过 concat 操作符,我们可以将多个 Obs...

    1 年前
  • Vuex 的状态管理常见问题

    Vuex 是一个现代的状态管理库,用于统一管理 Vue.js 应用程序中的数据状态。它使用了集中式存储模式,使得状态变化变得可追踪、可调试、可预测。但是,使用 Vuex 过程中也会遇到一些问题或者疑惑...

    1 年前
  • Chai.js 中 expect 断言的高级用法

    Chai.js 中 expect 断言的高级用法 在前端开发中,测试是非常重要的一环。而在 JavaScript 的测试库中,Chai.js 是非常流行且优秀的一种选择。

    1 年前
  • 如何在 Scully 项目中使用 Tailwind CSS?

    前言 Scully 是一个基于 Angular 的静态网站生成工具,用于生成快速、安全、高性能的静态网站。而 Tailwind CSS 是一款快速、灵活的 CSS 框架,可以帮助我们快速开发出美观、高...

    1 年前
  • Sequelize 中的 Hooks 概述及使用教程

    在使用 Sequelize ORM 进行数据库操作的过程中,有时会遇到一些需要在钩子函数中执行的操作,例如在插入数据前对数据进行处理、在删除数据后进行相关操作等,这时 Sequelize Hooks ...

    1 年前
  • 梳理 ES9 中的扩展运算符

    在 ES6 中,新增了扩展运算符 ...,可以将数组或者对象进行展开,方便使用, ES9 中的扩展运算符又进一步增强了其功能。 扩展运算符的基本用法 扩展运算符 ... 用于对数组或者对象进行展开,如...

    1 年前
  • Webpack 优化之缓存策略

    Webpack 是一个强大的前端自动化打包工具,但在项目开发过程中,我们经常会遇到构建速度慢或开发效率低的问题。其中一个重要原因是缺乏有效的缓存策略。在本文中,我们将讲述如何使用 Webpack 的缓...

    1 年前
  • Redux 架构的进一步扩展

    在前端开发中,Redux 是一个非常流行的状态管理库。它提供了可预测的状态管理机制,可以让开发者更好地管理应用的状态。但随着应用的增长和复杂度的提高,用 Redux 进行状态管理的难度也会随之增加。

    1 年前
  • Node.js 中使用 Passport 进行用户验证

    在 web 开发中,用户验证是一个重要的部分。传统的用户验证一般使用用户名和密码,但是这种方式存在许多安全风险,比如用户的密码可能被黑客盗取。为了提高用户验证的安全性,并且方便用户登录,我们可以使用 ...

    1 年前
  • React Hook 实现 Modal 弹窗

    随着前端技术的不断发展,React 在前端领域越来越受到开发者的追捧。而 React Hook 则是 React 16.8 版本新增的一项特性,它能够让开发者在函数组件中使用 state 和其他 Re...

    1 年前
  • 在 LESS 中使用变量控制垂直居中

    在前端开发中,居中是一个经常用到的操作。特别是在响应式布局中,让元素垂直居中是必不可少的。而在使用 LESS 进行样式编写时,可以利用变量的特性来控制垂直居中的效果。

    1 年前
  • 如何使用 Headless CMS 管理视频资源

    随着现代数字媒体技术的快速发展,视频已成为最受欢迎的媒体形式之一。前端工程师需要处理大量的视频,包括视频的存储和管理。Headless CMS 是一种基于 API 的内容管理系统,提供了一种优秀的方式...

    1 年前
  • Kubernetes 中对 Pod 的控制策略分析

    Kubernetes是一个开源的容器集群管理系统,可以自动化地部署、扩展和管理容器化应用程序。在Kubernetes中,Pod是最小的可部署的单元,一个Pod可以包含一个或多个紧密关联的容器。

    1 年前
  • Koa + Passport.js 实现本地注册和登录

    在 Web 应用开发中,用户认证和授权是常见的需求。Passport.js 是一个简单灵活的认证中间件,支持多种认证策略,如本地认证、OAuth 等,且可以与 Koa 框架无缝集成。

    1 年前

相关推荐

    暂无文章