Nextjs优化的Image组件的“imageSizes”配置选项实际上是做什么的?

eufgjt7s  于 2023-08-04  发布在  其他
关注(0)|答案(1)|浏览(153)

我一直在使用Next.js新的优化图像组件,我想我理解它在使用不同的布局选项(intrinsicfixedresponsivefill)时是如何工作的。但是,有一个名为imageSizes的配置选项我不明白。
从文档中,我可以看出有两个默认配置选项:

module.exports = {
  images: {
    deviceSizes: [640, 750, 828, 1080, 1200, 1920, 2048, 3840],
    imageSizes: [16, 32, 48, 64, 96, 128, 256, 384],
  },
}

字符串
如果我没理解错的话,devicesSizes是一个排序断点数组;当对一个映像使用fillresponsive布局时,Nextjs会创建宽度与断点相对应的多个映像版本,并在为该映像自动生成的srcset中引用这些版本。我们也可以通过sizes属性告诉浏览器如何使用这些版本。举例来说:

<Image 
    image={ image }
    layout="responsive" 
    sizes="(max-width: 500px) 100vw, 25vw" 
    width={1200}
    height={960}
/>


对于imageSizes,文档说明:
您可以使用imageSizes性质指定影像长度的清单。这些宽度应该与deviceSizes中定义的宽度不同(通常更小),因为数组将被连接。当next/image组件使用layout=“fixed”或layout=“intrinsic”时,将使用这些宽度。
这是否意味着,当使用fixedintrinsic布局时,Nextjs会创建宽度与imageSizes中的值相对应的图像的多个版本?如果是这样的话,您如何告诉<Image />组件使用哪一个(因为文档还说size prop 只能与fillresponsive布局一起使用)?
换句话说,如果我有一个1200 px宽的图像,我想以imageSizes中指定的一个大小使用它,我该如何做?

o75abkj4

o75abkj41#

你无法选择。

算法会根据场景为您选择……

你必须意识到的第一件事是,一个组(deviceSizes)用于大图像和两个布局:填充和响应:另一个是小图像(imageSizes)和最后两个布局:固定的和固有的。
让我们运行一些测试,看看结果:
下一个配置:

images: {
    deviceSizes: [640, 750, 828, 1080, 1200],
    imageSizes:  [32,  64,  96,  128,   256],
}

字符串
组件配置:

const ImageUse = () => {
  return (
    <>
      <div style={{ position: 'relative', display: 'block', width: '1100px', height: "766px" }}>
        <Image layout="fill" src="/assets/image_1.jpg" />
      </div>
      <div style={{ position: 'relative', display: 'block', width: '100%', height: "auto" }}>
        <Image
          layout="responsive"
          src="/assets/image_2.jpg"
          width="700"
          height="560"
        />
      </div>
      <div style={{ position: 'relative', display: 'block', width: '200px', height: "160px" }}>
        <Image
          layout="fixed"
          src="/assets/image_3.jpg"
          width="180"
          height="64"
        />
      </div>
      <div style={{ position: 'relative', display: 'block', width: '100px', height: "72px" }}>
        <Image
          layout="intrinsic"
          src="/assets/image_4.jpg"
          width="96"
          height="60"
        />
      </div>
    </>
  );
};


这就是结果:

originImage: 1475w x 1180h (jpg)

viewport:    1100w
1 and 2: 1200w x 960h 
3 and 4: 250w x 205h

viewport:    900w
1 and 2: 1080w x 864h 
3: 256w x 205h
4: 96w x 77h

viewport:    700w
1 and 2: 640w x 512h 
3: 256w x 205h
4: 96w x 77h


你看到了吗?根据图像在相应配置中的范围,你会得到不同的结果。
很难猜出会是哪种选择。900w的视口得到了1080w的图像(上面的视口大小选择)。700的图像比视口小。

**你没有精确地选择图像,但这并不意味着你没有很多控制权。

感谢@bobarros在Github上回答了这个问题:https://github.com/vercel/next.js/discussions/24771

相关问题