使用 GraphQL 进行前后端分离

传统的前后端分离方式是通过 RESTful API 进行数据交换的,这种方式存在一些不便之处。例如,服务器端的数据结构必须要和前端的需求一一对应,接口数量庞大,版本管理复杂等问题都会给开发和维护带来不小的困难。

GraphQL 是一种更现代化,更灵活的前后端分离方式。本文将介绍 GraphQL 的基本概念和优点,并提供实际的示例代码,帮助读者了解如何使用 GraphQL 进行前后端分离。

什么是 GraphQL

GraphQL 是一种由 Facebook 开发的 API 查询语言,它允许前端开发者通过定义数据结构的方式来获取服务器端的数据。GraphQL 定义了一个强类型的 Schema,而且 Schema 是可供前端界面查询的。

GraphQL 和 REST 的比较

REST 是目前使用最广泛的 API 设计方式之一,它的优点是易于理解和实现。然而,REST 设计方式的一个不足之处是服务器端数据结构必须要和前端界面需求一一对应,这样就需要开发者进行大量的 API 设计和维护。

GraphQL 的使用则优化了这一过程,提供了以下优点:

  • 更少的网络请求数量:传统的 RESTful API 的响应结果通常是完整的资源对象,而 GraphQL 则可以通过单个请求获取指定的域或子域数据。通过 GraphQL,前端可以一次性获取多个资源对象,而不需要额外的网络请求,大大减少了网络通信的开销。

  • 灵活的查询:GraphQL 的查询是由前端定义的,使前端完全自主地查询服务器数据。前端可以指定所需的数据的具体字段,甚至可以在一次查询中获取多个不同数据源的数据。这意味着后端可以自由地调整数据结构,而无需担心前端可能无法解析新的数据结构版本。

  • 直接发挥数据:传统的 RESTful API 最大的限制是只能获得完整的资源对象。这样就通常导致了大量未使用或未采用的数据占据了传输带宽的一大部分。GraphQL 查询是直接相关的,可以保证最大限度的数据使用,减少了无用数据的传输。

实现 GraphQL

GraphQL 的实现分为客户端和服务器端两部分。

服务器端

服务器端的 GraphQL 实现经常使用 Node.js,我们需要安装 apollo-server-express 依赖。

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

定义一个初始化 GraphQL 的脚本。

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

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

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

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

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

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

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

此代码在本地的 4000 端口上启动 GraphQL 服务器,您可以使用浏览器访问 http:// localhost:4000 / graphql 进行查询调试。

客户端

我们需要安装如下依赖:

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

使用 apollo-boostreact-apollo 来初始化 Apollo 客户端以获取数据。

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

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

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

在组件中进行 GraphQL 查询。

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

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

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

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

在此示例中,使用了 Query 组件查询 GET_HELLO 中的数据。该组件将 loadingerrordata 作为函数组件提供。函数组件返回组件 UI,以显示 hello 字段。

总结

GraphQL 提供了一种新的前后端分离方式,它可以让前端发送查询请求,而不是资源请求,以获取所需的数据,这样可以大幅减少后端服务器的负担,并提高前端开发的效率。这种新的架构方式更加灵活、高效、易于维护和扩展。因此,使用 GraphQL 作为前后端分离的 API 设计方式,对于团队的开发效率和产品的性能提升都是有好处的。

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


猜你喜欢

  • Mongoose 中的批量更新操作详解

    在使用 Mongoose 进行 MongoDB 数据库操作时,有时需要对多条数据进行批量更新。Mongoose 提供了几种不同的方法来实现批量更新操作,本文将为大家详细介绍其中两种最常用的方法:upd...

    1 年前
  • ES8 引入的新函数:Object.entries 和 Object.values

    随着 JavaScript 发展的不断壮大,ECMAScript 标准化过程中每一次新的版本都会带来一些新的函数和功能。在 ECMAScript 8 中,新加入了两个非常方便的函数:Object.en...

    1 年前
  • 在 TypeScript 中使用 Babel:教程

    在 TypeScript 中使用 Babel:教程 随着前端技术的迅猛发展,看似简单的页面开发变得越来越复杂,这也导致了项目代码量的急剧增加。为了保证开发效率和代码质量,typescript(简称 T...

    1 年前
  • ES12 中引入的 Logical Assignment 操作符

    ES12 中引入了 Logical Assignment 操作符,它是在逻辑运算符和赋值运算符的基础上进行的一次整合,用于进行逻辑计算,并将结果赋值给一个变量。这个新特性的引入,将会使得前端开发更加方...

    1 年前
  • Redis 的消息队列实现及应用

    Redis 是一个高性能的键值数据库,被广泛应用于缓存、计数器、排行榜等场景。除了常见的键值存储功能外,Redis 还提供了列表、哈希表、集合、有序集合等数据结构,支持一些高级操作(事务、Lua 脚本...

    1 年前
  • 使用 ES10 的 Array.flat 和 Array.flatMap 解决多级数组嵌套

    在开发前端项目时,经常会用到嵌套的数组来组织数据。但是当数组有多级嵌套时,操作变得复杂而繁琐。ES10 新增了两个数组方法 —— Array.flat 和 Array.flatMap。

    1 年前
  • Socket.io 如何实现多房间聊天

    介绍 Socket.io 是一个基于 Node.js 的实时应用程序框架,它支持双向通信和事件驱动编程。它可以让我们轻松地实现实时通信应用,例如聊天室。在这篇文章中,我们将介绍使用 Socket.io...

    1 年前
  • 基于 Promise 封装 fetch 请求

    Web 应用程序中,使用 HTTP 协议进行数据交换是一种常见的方式。fetch API 是 JavaScript 提供的一种新方式用于获取资源,它提供了与 XMLHttpRequest 相似的功能,...

    1 年前
  • 使用 Server-sent Events 在游戏中实现实时通讯

    随着互联网的发展和技术的进步,越来越多的游戏开始向在线化和社交化方向发展。为了实现多人在线游戏的实时通讯,WebSocket 和长轮询是常见的解决方案,但是它们都需要客户端和服务器之间建立持久连接,不...

    1 年前
  • 在 Serverless 项目中使用 Kubernetes

    前言 Kubernetes 是一个非常强大的容器编排系统,在 Serverless 项目中使用 Kubernetes 可以帮助我们解决很多问题,并提高我们的应用性能和可靠性。

    1 年前
  • 使用 Fastify 构建消息队列服务

    在现代 Web 应用程序中,消息队列变得非常流行,因为它们在异步通信和基于事件的架构中发挥着重要作用。尤其在前端开发中,通过消息队列能够实现更加高效的通信,从而提升应用程序的性能和可扩展性。

    1 年前
  • Flux 架构的 React 实践指南

    Flux 架构是 Facebook 公司开发的一种前端开发模式,用于处理大型复杂的应用程序。Flux 架构是 MVC 架构的一种改进,采用了单向数据流的设计,结合 React 库可以更好地实现复杂的交...

    1 年前
  • 如何通过 Custom Elements 实现代码重用?

    在 Web 前端开发中,很多时候会遇到组件化的需求。而 Custom Elements 就是一种实现组件化的方式,它可以让我们通过自定义 HTML 元素来实现代码重用,提高代码的复用性和可维护性。

    1 年前
  • Kubernetes 之总指南:如何优化调度性能

    Kubernetes 是一个开源的容器编排工具,它可以帮助开发人员和 DevOps 工程师更方便地管理容器化的应用程序。在 Kubernetes 中,调度是一个非常关键的组件,因为它负责将容器调度到集...

    1 年前
  • 如何使用 LESS 定义样式表的变量?

    在前端开发中,使用 CSS 定义样式表是必不可少的。然而,经常会遇到需要更改大量 CSS 属性的情况。为了减少代码量并提高开发效率,我们可以使用 LESS 这一样式表预处理器,来使样式表更易于维护和管...

    1 年前
  • 解决 AngularJS SPA 中文件上传的问题

    在使用 AngularJS 开发单页应用程序(SPA)时,文件上传是一个常见的需求。然而,由于单页应用程序的特殊性,文件上传存在一些问题,需要我们在实践中逐步解决。

    1 年前
  • Sequelize 中的虚拟列使用方法

    在 Sequelize 中,虚拟列是指在数据库中不存在,但是在 Sequelize 中通过逻辑计算、关联查询等方式生成的列,通常用于增强查询功能。 创建虚拟列 在声明 Sequelize Model ...

    1 年前
  • Node.js 中如何使用 WebSocket 实现聊天室?

    WebSocket 是一种新的通信协议,它可以在客户端和服务器之间建立持久性的连接,实现即时通信。在实时性较高的应用场景中使用 WebSocket 可以取代传统的轮询方式,节省带宽、降低延迟,提高应用...

    1 年前
  • Hapi 插件实现之上传文件至阿里云 OSS

    在网络应用中,文件上传功能是非常常见的需求,而阿里云 OSS(Object Storage Service)则是国内领先的海量数据存储和处理平台。本文将介绍如何通过 Hapi 插件实现文件上传至阿里云...

    1 年前
  • 如何使用 Headless CMS 实现社交媒体集成?

    Headless CMS 是一种不包含前端界面的内容管理系统,它将内容与技术分离,提供一个 API 接口,用于请求和管理内容。这意味着,开发者可以使用各种技术栈来构建前端,而不用担心后端数据的获取和管...

    1 年前

相关推荐

    暂无文章