Apollo Client 如何在 React 应用程序中缓存 GraphQL 查询结果

阅读时长 8 分钟读完

前言

GraphQL 是一种用于 API 的查询语言,它提供了一种更加高效、强大和灵活的方式来获取和处理数据。而 Apollo Client 是一款用于管理 GraphQL 服务端与客户端之间交互的前端框架,它能够自动处理各种网络请求、缓存数据,而使你的应用程序获得更好的性能和可维护性。

在本篇文章中,我们将会探讨 Apollo Client 如何在 React 应用程序中缓存 GraphQL 查询结果,以及如何使用缓存来优化应用程序性能,降低网络延迟以及提升用户体验。

Apollo Client 的缓存机制

Apollo Client 内建了一套缓存机制,它能够在收到 GraphQL 查询结果后自动将数据存储在缓存中。当你再次发起查询时,Apollo Client 会自动检查缓存中是否存在该查询结果,如果存在,则直接从缓存中取出,而无需重新请求服务器。

在 Apollo Client 中,所有查询结果都被存储在一颗基于 JavaScript 对象的查询结果树中,该树拥有一个全局唯一的名为 cache 的实例,所有查询结果都被存储在其中。因此,只要当前组件传递给被包含组件的 GraphQL 查询中包含了该查询结果的相关数据,Apollo Client 就会自动从缓存中获取结果。

性能优化:使用缓存

1. 如何在 Apollo Client 中使用缓存

在上一节中,我们提到 Apollo Client 默认会自动缓存所有的查询结果。但是,有时服务器响应的数据可能会对应着大量的 GraphQL 查询,我们并不希望将所有的查询结果都存储在缓存中,因为这可能会导致缓存体积过大,反而会影响应用程序的性能。

因此,在使用缓存时,我们需要注意以下几点:

  • 查询时,尽量传递最小化的参数,只需返回需要的数据;
  • 将查询结果存储在具备唯一标示符的对象上,并将其存储在缓存中;
  • 在查询时,利用 Apollo Client 提供的缓存 API 查询缓存中是否已经有过该数据,并返回缓存中的数据,从而避免了和服务器间不必要的请求和数据传输。

例如我们有一个简单的 React 组件如下:

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

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

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

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

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

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

对于上述组件中的 GraphQL 查询,我们可以将其结果存储在缓存中并重用以提高应用程序的渲染速度。

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

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

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

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

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

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

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

在组件初始化后,我们使用 useApolloClient() 方法获取 Apollo Client 的实例,然后在 useQuery() 方法返回的 data 对象中,写入用于查询缓存 GET_BOOK_LIST 的数据。

除了 writeQuery() 方法,Apollo Client 还提供了 readQuery() 方法和 writeFragment() 方法等缓存 API,这些 API 允许我们更加高效和灵活地使用缓存机制。

2. 缓存键的使用

在 Apollo Client 缓存中,每个缓存数据都有一个相应的缓存键(cache key),它是一个唯一的字符串,用于将查询结果缓存到正确的位置。缓存键通常为字符串组成,根据 GraphQL 查询的参数生成。

通常来说,缓存键的生成规则都是基于 GraphQL 查询中的数据,比如查询条件、参数、节点类型等来生成,以确保每一个查询都有唯一的缓存键。例如:

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

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

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

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

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

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

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

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

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

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

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

在上述代码中,我们将查询缓存的键值通过 getCacheKey() 函数生成,然后在 useQuery() 方法中使用该键值作为 GraphQL 查询的参数,使得 Apollo Client 能够根据该键值找到相应地查询结果。

同样,在使用 writeQuery() 方法将查询结果写入 Apollo Client 缓存时,我们也需要注意生成正确的缓存键。

结论

通过上述内容,我们了解了 Apollo Client 的缓存机制,并学习了如何在应用程序中使用缓存来提高应用程序的渲染速度,降低网络请求,提升用户体验等方面的优化。同时,我们也需要注意缓存键的使用,以避免缓存数据被覆盖或无法找到的情况发生。

Apollo Client 的缓存机制为我们提供了一种高效、灵活的方式来管理复杂的 GraphQL 数据,为现代 Web 应用程序的开发提供了便利,同时也增加了 Web 应用程序的性能和可维护性。

参考文献

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6749043e93696b02680a91c5

纠错
反馈