性能优化-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;

效果

组件加载前

组件懒加载后

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

相关推荐
携欢5 分钟前
PortSwigger靶场之盲 SSRF(服务器端请求伪造)漏洞通关秘籍
前端·网络·安全·web安全
慧慧吖@13 分钟前
前端关于埋点
前端
universe_0117 分钟前
前端学习css
前端·css·学习
腾讯云云开发1 小时前
小程序数据库权限管理,一看就会!——CloudBase新手指南
前端·数据库·微信小程序
多则惑少则明1 小时前
Vue开发系列——自定义组件开发
前端·javascript·vue.js
用户250694921612 小时前
next框架打包.next文件夹部署
前端
程序猿小蒜2 小时前
基于springboot的校园社团信息管理系统开发与设计
java·前端·spring boot·后端·spring
一叶难遮天2 小时前
开启RN之旅——前端基础
前端·javascript·promise·js基础·es6/ts·npm/nrm
申阳2 小时前
Day 4:02. 基于Nuxt开发博客项目-整合 Inspira UI
前端·后端·程序员
程序猿_极客2 小时前
【期末网页设计作业】HTML+CSS+JavaScript 猫咪主题网站开发(附源码与效果演示)
前端·css·html·课程设计·网页设计作业