Next 组件篇
Image
使用
Image 是 Next 提供的组件之一,使用 Image 时就像使用 Image 标签一样。
1 | |

必须的属性
在使用 Image 时,src、width 和 height 是必须的属性。
src 支持图片路径的格式,但是要注意如果使用远程地址,需要在 next.config.js 中声明支持的远程地址图片。
1 | |
另外也支持静态的 import 导入的图片,使用 await import 是不行的,在构建时无法被分析。并且如果使用了 import 导入的图片,那么就不需要使用 width 和 height 了。
width 和 height 用来推断宽高比,除非是静态导入图片或者图片有 fill 属性,否则为必选项。
其他属性
alt 图片描述,用于 SEO 和在图片被禁用或者加载失败时显示。
loader 解析图片地址的自定义函数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19'use client'
import Image from 'next/image'
const imageLoader = ({ src, width, quality }) => {
return `https://example.com/${src}?w=${width}&q=${quality || 75}`
}
export default function Page() {
return (
<Image
loader={imageLoader}
src="me.png"
alt="Picture of the author"
width={500}
height={500}
/>
)
}fill 是否填充父元素,默认为 false,当开启这个属性时,父元素必须 position 为
relative、fixed、absolute,img 元素会默认自动指定为position: "absolute"。
关于填充还可以通过 CSS 的方式来实现,object-fit: "contain"和object-fit: "cover"都可以用来填充父元素,他们的区别在于
使用 fill 属性时,图片会被拉伸以填充父元素;
使用object-fit: "container"时图片在保持其宽高比的同时填充元素的整个内容框;
使用object-fit: "cover"时图片在保持其宽高比的同时填充元素的整个内容框。如果对象的宽高比与内容框不相匹配,该对象将被剪裁以适应内容框;sizes
img 有一个属性 srcset 可以根据不同设备显示不同的图片
根据分辨率显示图片1
2
3
4<img
srcset="elva-fairy-320w.jpg, elva-fairy-480w.jpg 1.5x, elva-fairy-640w.jpg 2x"
src="elva-fairy-640w.jpg"
alt="Elva dressed as a fairy" />在一般情况下显示 elva-fairy-320w.jpg 图片即可,当用户的分辨率比较高的时候,会根据用户的分辨率选择 elva-fairy-480w.jpg 或者 elva-fairy-640w.jpg
根据设备大小显示图片
1
2
3
4<img
srcset="elva-fairy-small.jpg 480w, elva-fairy-large.jpg 800w"
src="elva-fairy-large.jpg"
alt="Elva dressed as a fairy" />有两种图片可以选择,elva-fairy-small.jpg 宽度为 480px,elva-fairy-large.jpg 宽度为 800px,不过当窗口宽度不能匹配图片的宽度,也就是窗口宽度为 680px 时,还需要配合使用 sizes 属性帮助浏览器选择合适的图片
1
2
3
4
5
6<img
srcset="elva-fairy-small.jpg 480w, elva-fairy-large.jpg 800w"
sizes="(max-width: 600px) 480px,
800px"
src="elva-fairy-large.jpg"
alt="Elva dressed as a fairy" />sizes 首先
(max-width: 600px)是一个媒体条件,看当前视口是否小于等于 600px ,如果是,则使用 480px 的图片,否则使用 800px 的图片。不过 Next 的 Image 并需要设置 srcset 属性,Next 会自动生成,如果你不设置组件的 sizes 属性,Next.js 会用 1x、2x 这种像素密度描述符,而如果你设置了 sizes 属性,Next.js 会用 640w、750w 这种固有宽度描述符。
quality
优化图片的质量,值为1到100之间的整数,越大品质越好。priority
图片加载优先级,boolean类型,默认为false,设置为true时,图片优先级高并预加载,开启这个属性会禁用懒加载。placeholder
占位符,默认值为empty,没有占位符
值为blur时使用 blurDataURL 的值作为占位符图片 src 属性值是 import 静态导入的,会自动生成 blurDataURL值
值为data:image/...时, 使用 Data URL 作为图片加载时的占位图片blurDataURL
当 placeholder 是,使用该值作为占位符。必须是 base64 编码的图片。onLoadingComplete
图片加载完毕执行该回调函数,删除占位符图片,需要使用客户端组件。1
2'use client'
<Image onLoadingComplete={(img) => console.log(img.naturalWidth)} />onLoad
图片加载完的时候执行,但该回调函数可能会在占位符被删除以及图片被完全解码前执行。需要使用客户端组件。onError
加载失败执行,需要使用客户端组件。loading
图片加载行为,默认为 loading 懒加载,值为 eager 的时候,图片会被立即加载,但影响性能。unoptimized
关闭优化,使用源图片,默认为 false
在 next.config.js 中配置
- remotePatterns
配置支持的远程地址图片,在上文中有提到。 - loaderFile
作用于所有 next/image 的 loader 函数 - deviceSizes
声明一系列的设备宽度断点,用来推断正确加载的图片
默认值是deviceSizes: [640, 750, 828, 1080, 1200, 1920, 2048, 3840], - imageSizes
声明一系列的图片宽度
默认值是imageSizes: [16, 32, 48, 64, 96, 128, 256, 384],
和 deviceSizes 区别在于 deviceSizes 用来处理大图片,imageSizes 用来处理小图片。而且 imageSizes 只会在图片使用了 sizes prop 的时候生效。 - formats
Next 的 Image Optimization API 会自动检测浏览器支持的图片格式
当匹配多个格式,按照数组顺序优先使用 - minimumCacheTTL
设置缓存优化请求图片的过期时间,单位为秒 - disableStaticImages
处理图片静态导入和其他插件冲突问题 - dangerouslyAllowSVG
使用默认图像优化 API 优化 SVG 图像
Link
Next 导航的主要方式。
1 | |
Props

- href:必填属性,指定跳转地址,支持传入对象,对象的属性有:
href:’http://user:pass@host.com:8080/p/a/t/h?query=string#hash‘
protocol:’http:’
host: ‘host.com:8080’
auth: ‘user:pass’
hostname: ‘host.com’
port: ‘8080’
pathname: ‘/p/a/t/h’
search: ‘?query=string’
path: ‘/p/a/t/h?query=string’
query: ‘query=string’ or {‘query’:’string’}
hash: ‘#hash’ - replace:history.replace 替换当前路由并且不会产生历史记录,默认为 false
- scroll:是否在跳转时滚动到页面顶部,默认为 false
- prefetch:是否预加载,默认为 true,预加载仅在生产环境开启
- 其他的 props 会传递到底层的 a 标签
Script
加载执行第三方脚本
Props

- src:指定加载的脚本源地址
- strategy:加载策略,
- beforeInteractive: 在可交互前加载,适用于如机器人检测、Cookie 管理等
- afterInteractive:默认值,在可交互后加载,适用于如数据统计等
- lazyOnload:在浏览器空闲时间加载
- worker:(实验性质)通过 web worker 加载
- onLoad:脚本加载完成时执行的回调函数
- onReady:组件每次重新挂载的时候执行
- onError:捕获错误