Next.js 图片怎么优化?

文章导读
Previous Quiz Next 在本文中,我们将学习在 Next.js 应用中优化图片的不同策略,以及使用优化图片的好处。
📋 目录
  1. Next.js Image 组件
  2. 优化本地图片
  3. 优化远程图片
  4. 优先加载图片
  5. Next.js 中的图片懒加载
A A

Next.js - 图片优化



Previous
Quiz
Next

在本文中,我们将学习在 Next.js 应用中优化图片的不同策略,以及使用优化图片的好处。

Next.js Image 组件

Next.js 提供了一个内置的 <Image> 组件,它扩展了 HTML 的 <img> 标签,用于优化网页中的图片。这个 <Image> 组件具有额外的 props 和属性,可以轻松在 Next.js 中创建优化的图片。<Image> 组件有助于

  • 尺寸优化 − 自动为每个设备提供正确尺寸的图片,使用现代图片格式如 WebP 和 AVIF。
  • 视觉稳定性 − 自动防止图片加载时发生布局偏移。
  • 更快的页面加载 − 仅在图片进入视口时加载,使用原生浏览器 lazy loading,并可选提供模糊占位符。
  • 资源灵活性 − 按需调整图片大小,即使是存储在远程服务器上的图片。

优化本地图片

本地图片指的是存储在 Next.js 应用目录中的图片。对于本地图片,Next.js 会根据导入的文件自动确定图片的固有宽度和高度。这些值用于确定图片比例,并在图片加载时防止 Layout Shift。

import Image from 'next/image';
import logo from './logo.png'
 
export default function Page() {
  return (
    <Image
        src={logo}
        alt="Picture of the Logo"
        // width={100} 在后端自动添加
        // height={100} 在后端自动添加
        // blurDataURL="data:..." 自动提供
        // placeholder="blur" // 可选的加载时模糊效果
    />
  )
}

优化远程图片

远程图片指的是存储在不同服务器上的图片(即 src 属性是一个 URL 字符串)。对于远程图片,你需要手动指定图片的宽度和高度。这是因为 Next.js 在构建过程中无法访问远程文件。

width 和 height 属性用于推断图片的正确宽高比,并在图片加载时避免布局偏移。提供的尺寸不会决定图片最终渲染的大小。

import Image from 'next/image'
 
export default function Page() {
  return (
    <Image
      src="https://www.example.com"
      alt="Picture of the Logo"
      width={500}       // 手动指定图片宽度
      height={500}      // 手动指定图片高度
    />
  )
}

优先加载图片

在 Next.js 中,我们可以使用 <Image> 组件的 'priority' prop 来优先加载特定图片。这对于占据视口较大区域的 LCP(Largest Contentful Paint)图片非常有用。在这种情况下,我们可以先加载 LCP 图片,然后按优先级加载其余图片。

示例

下面的代码显示了两张图片,其中一张比另一张具有更高的优先级。

import Image from 'next/image';

export default function Example() {
  return (
    <div>
      <h1>Image Priority</h1>
      <p>First Priority:</p>
      <Image src="/next.svg" alt="Image" priority /> 

      <p>Second Priority:</p>
      <Image src="/file.svg" alt="Image" />
    </div>
  );
}

输出

下面的图片显示了上述代码的输出。这里可以看到,当我们重新加载页面时,第一张图片立即加载,而第二张图片需要一些时间才能加载。

next.js image optimization priority loading

Next.js 中的图片懒加载

懒加载 是一种在 Web 应用中使用的优化技术,通过该技术,应用会延迟加载非关键资源,直到实际需要时才加载。在 Next.js 中,默认情况下所有图片都会被懒加载,这意味着它们仅在进入视口可见时才加载。如果您想禁用懒加载,可以在 <Image> 组件中将 loading 属性设置为 eager

示例

在以下示例中,我们使用 <Image> 组件来懒加载图片。第一张图片将被懒加载,而第二张图片将被急切加载。

import Image from 'next/image';

export default function Example() {
    return (
    <div>
        <h1>Lazy Loading:</h1>
        <Image
            src="/file.svg"
            alt="Example Image"
        />

        <h1>Eager Loading:</h1>   
        <Image
            src="/next.svg"
            alt="Example Image"
            loading='eager'    // 禁用懒加载
        />
    </div>
    );
}

输出

在下面的输出中,您可以看到当我们重新加载页面时,第一张图片渲染得很慢,而第二张图片则会立即渲染。

Next.js Lazy Loading Images