【化蛹为蝶】NextJS 图像渐进式加载

渐进式图像加载的原理可以看这篇文章:渐进式图像加载

NextJSImage 组件帮开发者内置了渐近加载的处理,需要在特定条件下使用

官网原话

Faster Page Loads: Images are only loaded when they enter the viewport using native browser lazy loading, with optional blur-up placeholders.

更快的页面加载:只有当图像进入视口时,才会使用浏览器的原生懒加载进行加载,还可以选择使用模糊占位符

使用方式(静态引入)

import Image from "next/image";
import mountains from "/public/mountains.jpg";

const PlaceholderBlur = () => (
   <Image
     alt="Mountains"
     src={mountains}
     placeholder="blur"
     width={700}
     height={475}
   />
);

export default PlaceholderBlur;

placeholder="blur" 即可,但必须使用 Import 静态引入图片的方式,这样 `NextJS 在构建时才会分析并对图像做渐进式加载的预处理

静态图像 DEMO

使用方式(动态)

动态图像也即 src 类型是 string 时,placeholder=‘blur’ 的 同时还必须给定 blurDataURL,此参数可以给一个已知的模糊且比较小的图片,也可以直接给纯色背景。

业界通常会利用 webp 格式制作模糊缩略图作为预加载图像进行占位,或是提取图像重点颜色作为纯色背景进行占位。

我们这里的 DEMO 简单些,使用固定纯色进行占位。

import Image from "next/image";
import { rgbDataURL } from '@/tools'

const Color = () => (
    <Image
      alt="Dog"
      src="/dog.jpg"
      placeholder="blur"
      blurDataURL={rgbDataURL(237, 181, 6)}
      width={750}
      height={1000}
    />
);

export default Color;

tools.ts 定义制作一个 base64 的像素点(最快)

// Pixel GIF code adapted from https://stackoverflow.com/a/33919020/266535
const keyStr =
  "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";

const triplet = (e1: number, e2: number, e3: number) =>
  keyStr.charAt(e1 >> 2) +
  keyStr.charAt(((e1 & 3) << 4) | (e2 >> 4)) +
  keyStr.charAt(((e2 & 15) << 2) | (e3 >> 6)) +
  keyStr.charAt(e3 & 63);

export const rgbDataURL = (r: number, g: number, b: number) =>
  `data:image/gif;base64,R0lGODlhAQABAPAA${
    triplet(0, r, g) + triplet(b, 255, 255)
  }/yH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==`;

动态图像 DEMO

  • 13
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

泡泡码客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值