React中的懒加载以及在Ice中实践

news/2024/7/15 17:16:44 标签: react.js, 前端, javascript

您好,如果喜欢我的文章,可以关注我的公众号「量子前端」,将不定期关注推送前端好文~

前言

对于页面性能优化,组件懒加载是个比较不错的方案,并且在整个项目打包后,如果未做代码分割,构建出的文件体积会非常大,也会出现比较常见的"访问项目某一页面,需要请求整个项目所有页面的资源"问题。

接下来讲一下在React中懒加载我们的组件。

Suspense和Lazy

何时使用lazy函数,比如某个体积相对比较大的第三方库或插件(比如JS版的PDF预览库)只在单页应用(SPA)的某一个不是首页的页面使用了,这种情况就可以考虑代码分割,增加首屏的加载速度。

lazy函数可以单独使用,但是在加载组件时候,页面可能会出现空白,此时需要添加loading,这时就需要Suspense了,代码如下:

const Foo = React.lazy(() => import('../componets/Foo)); 

<Foo />

上面的代码直接在函数中使用Foo组件页面加载时会出现白屏,所以需要Suspense来包裹,代码如下:

const Foo = React.lazy(() => import('../componets/Foo)); 

<React.Suspense fallback={<div>loading...</div>}> 
    <Foo/> 
</React.Suspense>

上述为基本使用,对于在当前页面想要懒加载其他组件的情况可以这样做:

import { Spin } from 'antd';
const OtherComponent = React.lazy(() => import('./OtherComponent'));

function MyComponent() {
  return (
    <div>
      <Suspense fallback={<Spin />}>
        <OtherComponent />
      </Suspense>
    </div>
  );
}

OtherComponent是通过懒加载加载进来的,所以渲染页面的时候可能会有延迟,但使用了Suspense之后,可优化交互。在<OtherComponent />外面使用Suspense标签,并在fallback中声明OtherComponent加载完成前做的事,即可优化整个页面的交互

fallback 属性接受任何在组件加载过程中你想展示的 React 元素。你可以将 Suspense 组件置于懒加载组件之上的任何位置。你甚至可以用一个 Suspense 组件包裹多个懒加载组件。

import { Spin } from 'antd';

const OtherComponent = React.lazy(() => import('./OtherComponent'));
const AnotherComponent = React.lazy(() => import('./AnotherComponent'));

function MyComponent() {
  return (
    <div>
      <Suspense fallback={<Spin />}>
        <section>
          <OtherComponent />
          <AnotherComponent />
        </section>
      </Suspense>
    </div>
  );
}

在Ice.js项目中实践

Ice项目中,如果想要对整个项目中所有页面进行页面级组件懒加载(代码分割),可以这样:

  1. app.tsx中配置fallback,对应Suspense中的fallback
import { Spin } from 'antd';

const appConfig: IAppConfig = {
  app: {
    rootId: 'ice-container',
  },
  router: {
    fallback: <Spin />,
    type: 'browser',
  },
};

runApp(appConfig);
  1. 在路由文件中使用懒加载的形式引入组件:
import { lazy, IRouterConfig } from 'ice';
import Layout from '@/layouts/BasicLayout';

const Home = lazy(() => import('@/pages/Home'));

const routes: IRouterConfig[] = [
  {
    path: '/',
    component: Layout,
    children: [
      {
        path: '/home',
        component: Home,
      },
    ],
  },
];

export default routes;
  1. build.json中配置懒加载模式构建,这样构建出来的产物会有多个javascript文件,实现代码分割:
{
    // ...
    "router": {
      "lazy": true
    }
}

这样,就实现了代码分割的效果啦~如图:

在这里插入图片描述


http://www.niftyadmin.cn/n/388491.html

相关文章

Simulink仿真模块 - Signal Conversion

目录 说明 实例 创建总线信号的连续副本 ​将虚拟总线转换为非虚拟总线 ​

Mybatais-plus超详细教程

文章目录 前言什么是Mybatis-plus特性引入依赖配置日志Service CRUD 接口SaveSaveOrUpdateRemoveUpdateGetListPageCount Chainqueryupdate Mapper CRUD 接口InsertDeleteUpdateSelect 赠送 前言 在学习Mybatis-plus之前&#xff0c;这里默认大家都已经对mybatis使用有了一定的…

scalar3 idea导入源码后仍然无法显示源码问题解决

最近心血来潮想要学习scala&#xff0c;直接选了最新的scala3.2.2&#xff0c;安装过程没啥好说的但是到了看源码的时候却死活加载不进去&#xff0c;话不多说&#xff0c;先看看网上大部分人给的过程&#xff08;这个过程也是导入源码必须的&#xff09; 1、进入scala官网选择…

docker安装 sqlserver2017 或者 2008

一、必要条件 服务器的运行内存必须大于2GB 二、拉取2017镜像 docker pull mcr.microsoft.com/mssql/server:2017-latest三、启动镜像 docker run --name sqlserver2017 --restart always -v /home/ceshi1:/var/opt/mssql -d -e ACCEPT_EULAY -e SA_PASSWORDqwer!#123 -…

最新版本 Stable Diffusion 开源 AI 绘画工具之微调模型篇

✨ 目录 &#x1f388; 模型种类&#x1f388; 变分自动编码器 / VAE&#x1f388; 美学梯度 / Aesthetic Gradients&#x1f388; 大型语言模型的低阶自适应 / LoRA&#x1f388; 超网络模型 / Hypernetwork&#x1f388; 微调模型 / LyCORIS &#x1f388; 模型种类 当你打开…

FineBI6.0基础学习第二课 集团毛利率下滑的原因

【案例背景】 在本期分析案例中,您将扮演一个大型商品零售集团的数据分析师,应对经理交给你的任务——发现集团毛利率下滑的原因,并给出建议; 随着您一步一步的探索分析,您将通过对商品和订单的相关历史数据的分析,逐步找出影响毛利率的关键要素,并给出相应的分析结论,…

【解决】PackageKit冲突

错误描述 [cfylocalhost protobuf-21.11]$ sudo yum install devtoolset-8 [sudo] cfy 的密码&#xff1a; 已加载插件&#xff1a;fastestmirror, langpacks /var/run/yum.pid 已被锁定&#xff0c;PID 为 26124 的另一个程序正在运行。 Another app is currently holding th…

springboot启动过程原理分析

前言 现在绝大多数java项目都上了Springboot框架, 因此深入理解Springboot框架的运行原理,能帮助我们更好的在Springboot框架下进行业务开发,同时能学习框架中优秀的设计思想, 本文主要是通过对Springboot源码的分析, 来理解整个springboot项目的启动流程. 因为Springboot不同…