性能优化-react路由懒加载和组件懒加载

背景

随着项目越来越大,打包后的包体积也越来越大,严重影响了首屏加载速度,需要对路由和组件做懒加载处理

主要用到了react中的lazy和Suspense。

废话不多说,直接上干货

路由懒加载

核心代码

js 复制代码
import React, { lazy, Suspense } from "react";
const loading = () => <h3>loading....</h3>;
const Caidan1 = lazy(() => import("@/pages/mud1/caidan1"));

const meunRoutes = [
  {
    name: "模块1",
    path: "/m1",
    icon: <AppstoreOutlined />,
    children: [
      {
        name: "gltf模型",
        path: "/m1/caidan12",
        icon: <AppstoreOutlined />,
        element: (
          <Suspense fallback={loading()}>
            <Caidan1 />
          </Suspense>
        ),
      },
    // 。。。。

配合路由表的完整例子

js 复制代码
// 路由表
import React, { lazy, Suspense } from "react";
import Home from "../pages/home";
import Layout from "@/components/Layout";

const loading = () => <h3>loading....</h3>;

const Caidan1 = lazy(() => import("@/pages/mud1/caidan1"));
const Caidan2 = lazy(() => import("@/pages/mud1/caidan2"));
// 404页面
const NotFound = () => <h1>**** 404 ****</h1>;

const meunRoutes = [
  {
    name: "模块1",
    path: "/m1",
    icon: <AppstoreOutlined />,
    children: [
      {
        name: "gltf模型",
        path: "/m1/caidan12",
        icon: <AppstoreOutlined />,
        element: (
          <Suspense fallback={loading()}>
            <Caidan1 />
          </Suspense>
        ),
      },
      {
        name: "模型动画",
        path: "/m1/caidan13",
        icon: <AppstoreOutlined />,
        element: (
          <Suspense fallback={loading()}>
            <Caidan2 />
          </Suspense>
        ),
      },
    ],
  },
];

// 配置路由表
const routes = [
  {
    path: "/",
    element: <Navigate to="/home" />,
  },
  {
    path: "/home",
    element: <Home />,
  },
  {
    path: "/",
    element: <Layout />,
    children: handleMenuRoutes(meunRoutes),
  },
  { path: "*", element: <NotFound /> },
];

// 处理menu routes
function handleMenuRoutes(arr) {
  let res = [];
  arr.forEach((item) => {
    if (item.children && item.children.length > 0) {
      item.children.forEach((yitem) => {
        let obj = {
          path: yitem.path,
          element: yitem.element,
        };
        res.push(obj);
      });
    }
  });
  return res;
}

const AppRouter = () => useRoutes([...routes]);
export { AppRouter, meunRoutes };

组件懒加载

js 复制代码
import { useEffect, useState, lazy, Suspense } from "react";

const TestCpn = lazy(() => import("@/components/testCpn"));
const Home = () => {
  const [show, setShow] = useState(false);

  function fn() { setShow(true)}

  return (
    <div>
      <button onClick={fn}>加载大组件</button>
      {show && (
        <Suspense>
          <TestCpn />
        </Suspense>
      )}
    </div>
  );
};
export default Home;

效果

组件加载前

组件懒加载后

这样就会大大加快首屏加载速度

相关推荐
扶风ff8 小时前
新品知识更新太快?用练题簿在线刷题,安排企业培训的小测与复盘
前端·学习·小程序
对空六课8 小时前
支持注意力分析的热力图工具有哪些?
前端·数据库·数据分析
Csvn10 小时前
Vue3 响应式与编译:依赖收集如何升级为节点级靶向更新
前端
星栈11 小时前
pnpm 12 升级实测
前端·javascript
Sirens.11 小时前
Java并发锁详解:六类锁策略与 synchronized 底层原理
java·前端·算法
Ai-_Man11 小时前
您您这可以把Microsofat Copilot的多个会话比如说。左侧的多个会话一次性导出吗?不是单条会话里面的多次会对话。AI导出鸭
javascript·人工智能·ai·小程序·电脑·copilot
特创数字科技12 小时前
一个纯本地运行的图片处理工具:压缩 / 裁剪 / 九宫格 / 圆角 / 滤镜 / 拼图 / 水印,终生使用
前端
IT_陈寒13 小时前
Vue的v-if和v-for混用居然是个天坑
前端·人工智能·后端
天衍四九-13 小时前
【无标题】
前端·spring boot·mysql·nginx·docker
广州华水科技13 小时前
2026年单北斗GNSS变形监测系统推荐榜单,解锁GNSS位移监测新高度
前端