nextjs 移动端组件延迟加载 性能优化

需求:Lighthouse 性能评分 出现  “避免 DOM 规模过大 ”

优化:

✅ 减少移动端初始加载体积
✅ 提升首屏加载速度
✅ 保持桌面端的完整体验
✅ 实现平滑的滚动加载效果
✅ 兼容现有的数据获取逻辑


LazyLoader.tsx

'use client';

import { useState, useEffect } from 'react';

export const LazyLoader = ({ children }: { children: React.ReactNode }) => {
  const [isMobile, setIsMobile] = useState(false);
  const [shouldRender, setShouldRender] = useState(false);

  useEffect(() => {
    // 检测移动端
    const checkMobile = () => {
      const isMobileDevice = window.matchMedia('(max-width: 768px)').matches;
      setIsMobile(isMobileDevice);
      if (!isMobileDevice) {
        setShouldRender(true); // 桌面端立即加载
      }
    };

    // 滚动处理函数
    const handleScroll = () => {
      const scrollY = window.scrollY || document.documentElement.scrollTop;
      const triggerPoint = window.innerHeight * 0.8;

      if (scrollY > triggerPoint) {
        setShouldRender(true);
        window.removeEventListener('scroll', handleScroll);
      }
    };

    checkMobile();

    if (isMobile) {
      window.addEventListener('scroll', handleScroll);
      return () => window.removeEventListener('scroll', handleScroll);
    }
  }, [isMobile]);

  return <>{shouldRender ? children : null}</>;
};

使用

import { LazyLoader } from '@/components/home/LazyLoader';  
     
 <LazyLoader>
    // 延迟加载代码
   <Suspense fallback={<InfoModuleSkeleton />}>
      <AsyncSportsModules lang={lang} />
   </Suspense>
</LazyLoader>


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值