使用 GraphQL 方式处理繁琐的数据业务逻辑

在前端开发中,当我们需要从服务器获取数据时,通常我们会使用 RESTful API。这种方式能够满足一般需求,但是当数据结构复杂、数据量大,或者查询方式多种多样的时候,就会显得不够灵活。

GraphQL 是一种新兴的数据查询语言,它可以让前端开发者更加灵活、高效地请求数据。本文将详细介绍 GraphQL 在前端开发中的应用,并提供实际案例以及代码实现。

什么是 GraphQL?

GraphQL 是一种由 Facebook 开发的数据查询语言和运行时。它通过定义类型和字段来描述应用程序中的数据模型,并允许客户端应用程序按需查询数据。与 RESTful API 不同的是,GraphQL 使用单个端点来处理多个查询请求,并且允许客户端请求特定数据字段,而不是返回整个数据集。

GraphQL 最初在 Facebook 内部使用,在 2015 年首次向外界发布。现在,它已经成为一个独立的开源项目,并且被许多大型公司广泛使用,如 GitHub、Yelp、Twitter、Shopify 等。

GraphQL 的优势

  1. 精确查询:GraphQL 允许客户端应用程序按需查询数据。客户端可以精确描述需要的数据,并且只会返回这些数据,无需返回整个数据集。这样可以减小网络传输的数据量,加快响应速度。
  2. 多个数据源:GraphQL 允许客户端应用程序同时查询多个数据源,并将结果合并在一起。这使得前端无需为每次查询请求创建一个新的 API,而是可以在一个 API 中处理所有请求,简化开发和维护。
  3. 开发效率:GraphQL 提供了强大的类型检查和自动文档生成功能,使得开发者可以更快地开发、测试和维护应用程序。

GraphQL 的使用

数据结构

在 GraphQL 中,数据结构由类型定义和字段组成。类型定义描述了数据类型及其属性,字段是数据类型中的属性。

例如,下面的类型定义描述了一个图书馆的数据结构:

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

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

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

在这个数据结构中,有三个类型:Library、Book、Author。Library 类型具有三个字段:name、address 和 books。books 是一个 Book 类型的数组,Book 类型有两个字段:title 和 author。author 是一个 Author 类型的对象,Author 类型有两个字段:name 和 nationality。

查询语句

在 GraphQL 中,客户端应用程序通过发送查询语句来请求数据。查询语句由查询字段和查询参数组成。查询字段是要获取的数据的字段,查询参数是在这些字段中应用的过滤和排序规则。

例如,下面是一个查询所有书籍和作者的查询语句:

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

这个查询语句表示客户端想要获取所有书籍的标题以及它们的作者的名字和国籍。服务器将返回一个包含这些字段的 JSON 数据。

变更操作

GraphQL 不仅支持查询数据,还支持变更数据。变更操作是指对服务器上的数据进行更改、删除或添加。变更操作由 mutation 字段定义,并且可以在变更操作中使用查询参数。

例如,下面的变更操作描述了向图书馆中添加新书的过程:

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

这个变更操作表示客户端想要将一本新书添加到图书馆中。服务器将返回包含新书的 title 和 author 的 JSON 数据。

GraphQL 实例

接下来,我们将编写一个使用 GraphQL 查询 GitHub API 的简单前端应用程序。我们将显示用户搜索结果的 GitHub 存储库列表,并可以单击存储库以查看更多详细信息。

1. 安装依赖

我们将使用 React 和 Apollo Client 来开发这个应用程序。要创建 React 应用程序,请运行以下命令:

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

在项目目录下,安装 Apollo 和其他依赖项:

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

2. 配置 Apollo 客户端

src/index.js 文件中,引入 ApolloClientInMemoryCache,然后创建客户端:

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

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

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

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

这里,我们创建了一个 Apollo 客户端,并将其作为应用程序的全局状态提供。客户端通过设置 uri 配置项来连接到 GitHub 的 GraphQL API。然后在请求头中添加了 authorization,用于进行身份验证。InMemoryCache 是 Apollo 提供的默认缓存实现。

3. 查询 GitHub API

src/App.js 文件中,我们将编写查询 GitHub API 的代码。首先,我们将定义一个查询 SEARCH_REPOS,它将搜索 GitHub 上匹配给定字符串的存储库。

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

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

查询需要一个参数 query,表示要搜索的字符串。查询会搜索前 10 个与查询字符串匹配的存储库,并返回这些存储库的 ID、名称、描述和所有者的登录名。

接下来,我们定义 App 组件,用于获取用户的查询字符串,并使用 useQuery hook 发布查询:

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

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

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

App 组件渲染一个文本框,用户可以输入查询字符串。当用户输入时,我们使用 setQuery 更新组件状态。当用户提交查询时,我们使用 useQuery hook 发送 SEARCH_REPOS 查询,并使用变量 query 填充查询参数。useQuery hook 将返回查询结果,包括 dataloadingerror。如果正在加载数据,我们将显示文本“Loading…”,如果出现错误,我们将显示错误信息。否则,我们将渲染所有匹配的存储库。

运行应用程序

现在应用程序就可以运行了。在终端中启动应用程序:

--- -----

在浏览器打开 http://localhost:3000/,输入要搜索的查询字符串,然后单击“Enter”键即可查看搜索结果。

总结

GraphQL 是一种强大的数据查询语言和运行时,可以在前端开发中处理繁琐数据业务逻辑。它提供了精确查询、多个数据源、开发效率等优势。前端开发者可以使用 GraphQL 取代传统的 RESTful API,从而更加高效、明确地请求数据。

在本文中,我们使用 GraphQL 查询了 GitHub API 并显示了用户搜索结果的存储库列表。这个例子展示了 GraphQL 在实际应用中的使用,也让我们更好地理解了 GraphQL 的优势。

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


猜你喜欢

  • LESS 中兼容版本问题解决方法

    前言 LESS 是一种动态样式语言,它扩展了 CSS,并且让样式更具可维护性和可扩展性。LESS 官方提供了多种方式来安装和使用 LESS,但是在使用过程中也会遇到一些兼容性问题,本文将带大家一起来解...

    1 年前
  • CSS Reset 教程 | 通往页面优秀之路

    在开发前端页面的过程中,页面风格和样式不可避免地会受到浏览器的影响。不同的浏览器对 CSS 样式会有自己的默认值,这样一来页面的呈现就可能变得不一致。为了避免这种情况,前端开发人员可以使用 CSS R...

    1 年前
  • Socket.io 实现 WebSocket 通信的总结

    在现代的 Web 开发中,实时性的需求越来越高,而 Socket.io 这个前端实时通信的库,能很好地解决在线聊天、多人游戏等需求。本文将总结 Socket.io 实现 WebSocket 通信的方法...

    1 年前
  • CSS Flexbox 中定义长宽比的技巧

    在前端开发中,CSS Flexbox 是一种常见而实用的布局方式。它可以让我们更方便地定义元素的排列方式,并且可以适应各种屏幕尺寸。在使用 Flexbox 布局时,经常需要定义元素的长宽比,本文将介绍...

    1 年前
  • Webpack 处理图片引用路径的方法

    当我们在开发前端应用时,很多时候需要使用图片资源。但是当我们在使用 Webpack 时,图片引用路径的处理可能会让我们感到困惑。本文将会介绍在 Webpack 中如何处理图片引用路径,以及如何优化图片...

    1 年前
  • 如何在 Deno 中安装第三方模块

    Deno 是一个基于 V8 引擎的安全 TypeScript 和 JavaScript 运行时,它提供了众多让 JavaScript 开发更加容易的特性。作为一个新兴的运行时,Deno 在 JavaS...

    1 年前
  • 避免 Vue SPA 应用出现内存泄露的方法

    在使用 Vue 单页应用(SPA)时,如果不注意内存管理,很容易出现内存泄露问题。这种情况下,内存中已经不再使用的对象还会保留在内存中,造成内存空间的浪费,甚至影响应用性能。

    1 年前
  • 在 PWA 应用中使用 Web Workers 实现任务分离

    在开发 PWA (Progressive Web App) 应用的过程中,为了提高应用的性能和用户体验,我们常常需要采取一些技术手段。其中一个重要的手段就是使用 Web Workers 技术实现任务分...

    1 年前
  • Vue.js 项目如何集成 WebSocket 做消息推送?

    简介 随着互联网的发展,各种 Web 应用正在变得越来越复杂,需要实时更新数据以提供更好的用户体验。传统的 HTTP 请求方式并不能很好地满足这个需求,因此 WebSocket 应运而生。

    1 年前
  • MongoDB 中的字段类型验证方法

    介绍 MongoDB 是一款非关系型数据库,它的数据存储形式是文档形式(Document),这个特性使得 MongoDB 的数据存储方式和传统的关系型数据库有很大的不同。

    1 年前
  • 将 SSE 用于网页游戏开发中

    前言 在现代化的网络应用中,前端技术扮演着越来越重要的角色,尤其是在网页游戏开发领域中。在传统的 HTTP 请求与响应模式下,难以支持实时数据的推送,而 SSE 技术则可以帮助我们在网页游戏中实现实时...

    1 年前
  • CSS3 角度优化无障碍设计

    在现代 Web 技术中,CSS3 已经成为了构建 Web 界面的基本技术之一。然而,在使用 CSS3 进行设计时,我们常常会忽略用户体验的问题,特别是在无障碍设计方面。

    1 年前
  • ES7 介绍:数组.includes(), 按位非操作符以及指数运算符

    简介 ES7 是 ECMAScript 的第七个版本,它引入了一些新的特性,包括数组.includes()、按位非操作符以及指数运算符等。本文将对这些新特性进行详细介绍。

    1 年前
  • 在 ES8 中如何使用 Object.getOwnPropertyDescriptors() 实现深复制对象?

    在 ES8 中如何使用 Object.getOwnPropertyDescriptors() 实现深复制对象? 在前端开发中,我们经常需要复制一个对象来进行处理,通常使用 Object.assign(...

    1 年前
  • MySQL 5.7 InnoDB 引擎优化详解

    MySQL 是目前最流行的关系型数据库之一,而 InnoDB 引擎是 MySQL 的默认存储引擎,也是最常用的存储引擎。本文将详细介绍如何优化 MySQL 5.7 InnoDB 引擎,以提高数据库性能...

    1 年前
  • PM2 进程监控的同时如何保证安全性?

    前端开发中,我们经常会使用 PM2 进行进程管理和监控。虽然 PM2 提供了方便的管理工具,但是如果不注意安全性,会引发很多安全问题。本文介绍如何在使用 PM2 进行进程监控的同时保证系统的安全性。

    1 年前
  • TypeScript 中的文本处理

    随着 TypeScript 在前端开发中的应用越来越广泛,文本处理成为了开发者们经常需要面对的问题。在 TypeScript 中,我们可以利用内置的字符串处理方法,或者使用第三方库实现更加灵活的文本处...

    1 年前
  • 为您的响应式设计提供全面的性能优化指南!

    作为一个前端开发者,我们都知道响应式设计是一个不可或缺的部分。它可以让您的网站在不同的设备上都能够优雅地展现,以提供更好的用户体验。但是,响应式设计在一些不当的实现下,可能会大大降低网站的性能。

    1 年前
  • Kubernetes 使用 Persistent Volume Claim 实现数据持久化

    前言 Kubernetes 是一个使用广泛的开源容器编排工具,它可以极大地简化容器化应用的部署、管理和扩展。在 Kubernetes 中,Pod 是基本的部署单元,而容器则是 Pod 中运行的实际应用...

    1 年前
  • Next.js 和 Google Maps API 的最佳实践和使用方法

    在现代 Web 应用程序中,地图服务已成为一个不可或缺的功能之一。Google Maps API 是一个强大且易于使用的地图服务 API,通过它可以轻松地将互动地图嵌入到您的网站、移动应用或桌面应用中...

    1 年前

相关推荐

    暂无文章