Next.js 中图片 Lazy Load 的实现技巧

在网站优化中,减少加载时间是一个常见的目标。在前端开发中,图片通常是最大的资源之一,并且是最常见的性能瓶颈之一。为了减少页面加载时间,我们可以使用一种称为“Lazy Load”的技术。在 Next.js 中,我们可以使用该技术来延迟加载图片。

Lazy Load 实际上是一种技术,它可以使图像仅在滚动到可见部分时才加载。这可以显著提高网站的性能,并减少页面的加载时间。由于 Next.js 具有自动代码分割功能,因此我们可以利用这一点并使用 React.lazy()代替传统的重量级解决方案。

实现步骤

我们可以使用 IntersectionObserver 和 React.lazy()来实现 Lazy Load。为了使 IntersectionObserver 正确运行,我们需要为其提供一个根元素。在这种情况下,我们可以使用 document.documentElement。

首先,让我们创建一个包含 img 元素的组件:

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

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

然后,我们将使用 React.lazy() 将我们的组件包装到组件中。在这种情况下,我们只需延迟加载一个图像,因此只需要包装一个组件。

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

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

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

在这个例子中,我们将 Image 组件包装在 React.lazy() 中。我们还包装了一个 Suspense 组件,这是一个需要 fallback 属性的特殊组件。fallback 属性接受一个加载时显示的 JSX 元素。在这种情况下,我们只是显示了一个“Loading...”文本。

现在,我们已经准备好使用 IntersectionObserver 来观察我们的组件何时位于视口中,然后加载组件中的图片。我们将使用 useEffect 钩子来注册 IntersectionObserver。

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

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

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

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

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

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

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

在这个例子中,我们创建了 useRef() 和 useEffect() 钩子。我们将 useRef 映射到包含我们组件的 div。我们首先创建了一个 IntersectionObserver,该观察者接受一个回调函数。每次该组件进入视口时,该回调函数将被调用。如果进入视口,我们只是断开观察者。

现在我们赋给该组件的 IntersectionObserver 已经准备好了,而且我们已经为其提供了一个根元素。但是,我们需要避免产生过多的 HTTP 请求。因此,我们可以在服务器端使用我们的组件进行优化。Next.js 为此提供了一个解决方案:为我们的图像属性传递一个 loading="lazy" 属性。

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

这将使浏览器知道在需要时延迟加载图像,从而减少网站的加载时间。

结论

Lazy Load 图片是一个易于实现的技术,可以大大提高网站的性能。在 Next.js 中,我们可以使用 IntersectionObserver 和 React.lazy() 来实现我们的组件。

我们第一步创建了一个包含图片元素的组件。接下来,我们将 Image 组件包装在 React.lazy() 中,并创建了一个 Suspense 组件来等待图像的加载。

我们使用 useEffect 钩子和 useRef 属性注册了 IntersectionObserver。这样,一旦我们的组件进入视口,它就会被加载。

最后,我们在服务器端为我们的组件添加了一个 loading="lazy" 属性,用于减少网站的加载时间。

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