Apollo client 将 GraphQL 查询缓存到 localStorage 中

阅读时长 7 分钟读完

前言

随着 Web 应用的发展和复杂化,前端开发也变得越来越重要。在前端开发中,GraphQL 是一种非常流行的查询语言,它能够帮助开发者更简单、更高效地获取数据。而 Apollo client 是一个广泛使用的 GraphQL 客户端库,它提供了很多强大的功能,其中包括将 GraphQL 查询缓存到 localStorage 中。

本文将详细介绍 Apollo client 如何实现将 GraphQL 查询缓存到 localStorage 中的功能,主要内容包括以下几个方面:

  • Apollo client 简介
  • Apollo client 的缓存机制
  • 将 GraphQL 查询缓存到 localStorage 中的实现方式
  • 示例代码

Apollo client 简介

Apollo client 是一个流行的 GraphQL 客户端库,它提供了很多强大的功能,如缓存、本地状态管理、错误处理等。

Apollo client 的主要作用是将 GraphQL 查询转换成 HTTP 请求,并将响应转换成 GraphQL 结果。它还提供了一些辅助函数,使得在应用程序中使用 GraphQL 更加容易。

Apollo client 的缓存机制

Apollo client 的缓存机制是基于数据标识符的,即每个数据都有一个唯一的标识符。这个标识符通常是一个字符串,可以是任何东西,例如一个数据库表的主键或一个 URL。

当 Apollo client 发送一个 GraphQL 查询时,它会检查缓存中是否已经存在该查询的结果。如果存在,它将返回缓存的结果,而不是发送新的请求。

如果缓存中不存在该查询的结果,Apollo client 将发送一个新的请求,并将响应存储在缓存中。下次发送相同的查询时,就可以直接从缓存中获取结果,而不必再发送请求。

将 GraphQL 查询缓存到 localStorage 中的实现方式

将 GraphQL 查询缓存到 localStorage 中可以提高应用程序的性能和用户体验。这样,在用户关闭浏览器窗口后,下次打开应用程序时,之前查询的结果仍然可以从缓存中获取,而不必再次发送请求。

要将 GraphQL 查询缓存到 localStorage 中,需要使用 Apollo client 的缓存机制,并在缓存中添加一个新的层,将数据存储到 localStorage 中。

首先,需要创建一个新的 InMemoryCache 实例,并将其传递给 ApolloClient 的构造函数中:

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

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

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

接下来,需要创建一个新的缓存存储器,将数据存储到 localStorage 中。可以使用 apollo-cache-persist 库来实现这一点:

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

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

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

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

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

现在,缓存已经可以持久化到 localStorage 中了。接下来,需要在查询结果中添加一个标识符,以便可以将其存储到缓存中。

可以使用 Apollo client 的 modify 方法来添加标识符。该方法需要一个函数作为参数,该函数将接收查询结果,并返回一个新的结果。可以在该函数中添加标识符。

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

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

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

在上面的代码中,使用了 fetchPolicy 选项来告诉 Apollo client,如果缓存中存在该查询的结果,则首先从缓存中获取结果,并在后台发送新的请求,以便更新缓存。

在 modify 函数中,将查询结果的 __typename 和 id 属性添加到 user 对象中。这样,每个 user 对象都会有一个唯一的标识符,可以将其存储到缓存中。

现在,查询结果已经可以缓存到 localStorage 中了。下次发送相同的查询时,Apollo client 将从缓存中获取结果,而不必再发送请求。

示例代码

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

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

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

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

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

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

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

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

总结

本文介绍了 Apollo client 如何将 GraphQL 查询缓存到 localStorage 中。通过使用 Apollo client 的缓存机制和 apollo-cache-persist 库,可以将查询结果持久化到本地存储中,以提高应用程序的性能和用户体验。

在实现时,需要将查询结果中添加一个唯一的标识符,并使用 Apollo client 的 modify 方法来修改查询结果。这样,每个查询结果都可以存储到缓存中,并在下次发送相同的查询时从缓存中获取结果。

希望本文可以帮助读者更好地理解 Apollo client 的缓存机制,并在实际开发中使用它来提高应用程序的性能和用户体验。

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

纠错
反馈