解读 GraphQL:在前端和后端应用中的最佳实践

前言

在前后端分离的项目中,前端需要和后端进行数据交互。而在传统的 REST 架构中,前端需要向后端发送多个请求才能获取到需要的数据,而且这些请求的数据有时候会产生冗余。这样导致了前后端之间的通信效率低下,给工作带来了一定的困难。

GraphQL 作为一种新型的数据查询语言来之不易,它为前后端之间的数据传输提供了解决方案。本篇文章将介绍 GraphQL 在前后端应用中的最佳实践,并提供一些代码示例以帮助开发人员更好地了解 GraphQL 技术。

什么是 GraphQL

GraphQL 是一种由 Facebook 开发并开源的数据查询语言。GraphQL 借鉴了 REST 架构的设计理念,让前端开发人员能够通过一个简单的 API 协议向后端发送数据请求,从而获得更加精确和高效的数据返回结果。

GraphQL 原理的核心是定义和使用 GraphQL schema(模式),schema 可以被描述为一组类型定义,它定义了数据查询的数据类型和结构,并且包含了一些解析器(resolver),用来解析数据库中的数据并输出 GraphQL 数据类型。

GraphQL 的最佳实践

1. 定义 schema

GraphQL 的 schema 是定义数据查询的重点,因此一个好的 schema 确定了数据交互的效率和开发效率。一般来说,schema 应该划分为查询、变化、订阅三个部分,它们分别指向查询数据、更改数据和持续数据流。主要包含以下几个概念:

  • Query:查询定义了查询关于数据不同类型的操作。
  • Mutation:该部分删除、修改或创建数据。
  • Subscription:它触发事件流,在持续的时间内推送数据。
-- ------- ------

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

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

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

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

2. 使用 DataLoader 进行数据加载

DataLoader 是一个功能强大的第三方库,与 GraphQL 集成紧密。它使得从数据库中查询数据变得更加容易和高效。DataLoader 基于批处理原理,可以批量查询每个请求的数据,并将其缓存起来,以避免数据库被频繁地查询。

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

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

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

3. 了解 resolver 处理

resolver 是 GraphQL 中的核心,它们从数据库读取数据并将结果返回到 API 中。因此,一个具有良好性能的 resolver 不仅可以加快 GraphQL 查询的速度,还可以提高系统的稳定性。

优化 resolver 的一个技巧是尽可能多地使用原生 SQL 语法,因为它比 ORM 更加快速和高效。同时,尽量避免在 resolver 中使用循环或递归等灵活的处理方式,因为它们可能导致性能下降。

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

4. 使用 Apollo Client 进行数据获取

Apollo Client 可以帮助我们更方便的使用 GraphQL 构建前端应用的数据获取功能,轻松地、自由的管理前端应用状态。最近的版本提供了更多的功能,比如当你使用 Apollo Client 进行数据获取时,数据是通过上下文传递到客户端,从而让应用更加易于扩展和管理。

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

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

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

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

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

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

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

总结

GraphQL 是一种适用于前后端分离场景的数据查询语言,它通过更加精确和高效的数据返回结果,解决了前后端之间的通信效率低下问题。在使用 GraphQL 时,定义 schema 和增强 resolver 处理性能是最重要的实践,同时使用 DataLoader 和 Apollo Client 可以让我们更加轻松和自由地管理前后端数据交互。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/665347b1d3423812e47c457b