如何在Swiper中实现Gatsby-Plugin-Image的懒加载?
Gatsby + Swiper.js 轮播图片按需加载解决方案
问题原因
默认Gatsby Image(含旧版gatsby-image和v3+版本的gatsby-plugin-image)的懒加载判定逻辑基于浏览器全局视口,轮播容器内不在滑动可视区域的项仍处于全局视口范围内,因此会被Gatsby Image判定为需要加载,导致所有轮播图片全量触发加载。
可行解决方案
方案1:动态渲染可见范围内的轮播项(最稳妥)
仅渲染当前激活项和你指定的前后预加载项的图片组件,其余滑动项仅渲染等尺寸占位容器,从根源避免不可见图片被加载:
import { useState } from 'react' import { Swiper, SwiperSlide } from 'swiper/react' import { GatsbyImage } from "gatsby-plugin-image" // 可自定义需要提前预加载的前后轮播项数量,设为1可保证滑动流畅度 const PRELOAD_COUNT = 1 const CustomCarousel = ({ slides }) => { const [activeIndex, setActiveIndex] = useState(0) return ( <Swiper onSlideChange={(swiper) => setActiveIndex(swiper.activeIndex)} // 其余你的Swiper配置项 > {slides.map((slide, index) => ( <SwiperSlide key={slide.id}> {Math.abs(index - activeIndex) <= PRELOAD_COUNT ? ( <GatsbyImage image={slide.gatsbyImageData} alt={slide.alt} // 其余你的GatsbyImage配置项 /> ) : ( // 占位容器宽高比和实际图片保持一致,避免滑动时出现布局跳动 <div style={{ aspectRatio: slide.imgAspectRatio }} /> )} </SwiperSlide> ))} </Swiper> ) }
方案2:用Swiper原生懒加载逻辑接管图片加载
关闭Gatsby Image自带的懒加载,将图片加载时机完全交给Swiper的懒加载模块控制:
- 引入Swiper的
Lazy模块并开启lazy: true配置 - 给Gatsby Image设置
loading="eager"、fadeIn={false}关闭自带懒加载和淡入效果,通过imgAttributes属性将图片源绑定到Swiper要求的data-src/data-srcset属性上
方案3:缩略图按需加载
如果同时存在缩略图滚动容器,复用方案1的逻辑:维护缩略图的可见索引范围,仅渲染可见区域内的缩略图Gatsby Image组件,其余渲染等尺寸占位即可。
以上方案对旧版
gatsby-image组件完全通用,仅需替换对应组件的属性名即可。
内容的提问来源于stack exchange,提问作者Jason Biondo
相关产品推荐
相关产品推荐

