如何在 Next.js 中实现远程请求和数据缓存?

阅读时长 6 分钟读完

前言

当我们构建一个 Next.js 应用时,我们可能需要从远程服务器获取数据。然而,大量的请求会导致应用的性能下降,因此,我们需要考虑为应用实现数据缓存来提高性能和响应速度。在本文中,我们将探讨如何在 Next.js 中实现远程请求和数据缓存。

看看 Next.js 中的 getStaticProps 函数

在 Next.js 中,我们可以使用 getStaticProps 函数来从服务器获取数据。该函数在构建时间(build time)被调用,并将通过 props 参数将获取的数据传递给页面组件。这种方法的好处是,我们只需在构建时获取数据一次,之后就可以对数据进行缓存。

下面是一个简单的使用 getStaticProps 函数的示例:

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

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

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

------ ------- ------
展开代码

如上所示,我们通过调用 fetch 函数从远程服务器获取数据,并将其传递给页面组件。这个函数在每个请求期间都会执行,并且这样的解决方案在性能方面有一些问题。

为什么我们需要数据缓存?

在上面的示例中,我们每次请求页面时都会从远程服务器获取数据,即使数据没有更改。这样做可能会对服务器造成压力,并浪费带宽和资源。因此,我们需要考虑对数据进行缓存,以便在必要时才重新获取它。

我们可以使用 Next.js 提供的一些缓存策略来实现数据缓存。在接下来的章节中,我们将了解这些缓存策略并看看如何使用它们来缓存数据。

getStaticProps 缓存策略

Next.js 提供了两种缓存策略,可以用于缓存数据。

缓存时间

第一个缓存策略是缓存时间。我们可以通过将 revalidate 属性添加到 getStaticProps 返回的对象中来指定要缓存的时间:

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

  ------ -
    ------ -
      ------
    --
    -- -- -- --
    ----------- ---
  --
-
展开代码

在上面的示例中,我们将缓存时间设置为 10 秒钟。这意味着数据将保留在缓存中,直到 10 秒钟过去,然后它将被重新获取。

缓存键(Cache Key)

缓存键允许我们指定一个缓存键值,在下一次请求相同的缓存键时,我们将从缓存中获取数据而不是重新获取它。我们可以将 getStaticProps 函数返回的对象中的 unvalidated 选项设置为 true,并将缓存键值添加到返回的 props 对象中:

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

  ------ -
    ------ -
      ------
      ---------- --- ---------------------
    --
    -- -- -- --
    ----------- ---
    -- ----------
    ------------ -----
  --
-
展开代码

在上面的示例中,我们向 props 对象添加了一个名为 updatedAt 的缓存键值属性。在下一次请求相同的缓存键时(即在 10 秒钟之内),我们将使用缓存数据。

客户端数据缓存

有时,我们可能需要从客户端进行数据请求。Next.js 提供了两个处理客户端请求的功能。我们将在下面的章节中了解这些功能。

SWR

SWR 是一个轻量级且易于使用的客户端数据请求库。它提供了数据请求,数据缓存和数据管理的所有功能。SWR 还具有“尽快从缓存中呈现”和“自动更新”等特性,这使得它成为 Next.js 应用的理想选择。

下面是如何在 Next.js 应用中使用 SWR 的示例:

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

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

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

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

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

------ ------- ---------
展开代码

我们可以在 useSWR 中指定 API 端点 URL(/api/products)。SWR 会处理数据的缓存和更新,因此我们无需担心性能问题。

React Query

React Query 是一个类似于 SWR 的库,提供了相似的功能,同时还有一些其他功能,如查询重试和缓存偏差等。

下面是在 Next.js 应用中使用 React Query 的示例:

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

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

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

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

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

------ ------- ---------
展开代码

如上所述,我们可以使用 useQuery hook,并指定查询的名称和要使用的函数(fetchProducts)。React Query 会在需要时保留数据,并自动更新数据。

结论

在本文中,我们了解了如何在 Next.js 中实现远程请求和数据缓存。我们看到了不同的缓存策略,如缓存时间和缓存键。我们还了解了两个处理客户端请求的库:SWR 和 React Query。

对于需要构建 Next.js 应用程序的开发人员来说,这些技术是至关重要的。数据缓存和优化可以大大提高应用程序的性能和响应速度,并更好地满足用户需求。

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

纠错
反馈

纠错反馈