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

简介: React懒加载介绍和实践

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

前言

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

接下来讲一下在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
    }
}

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

image.png

目录
相关文章
|
3月前
|
前端开发 JavaScript
深入理解并实践React Hooks —— useEffect与useState
深入理解并实践React Hooks —— useEffect与useState
160 1
|
7月前
|
前端开发 算法 API
Multi-Agent实践第4期:智能体的“想”与“做”-ReAct Agent
本期文章,我们将向大家展示如何使用AgentScope内置的ReAct智能体解决更为复杂的问题。
|
7月前
|
前端开发 JavaScript
React和Vue实现路由懒加载
React和Vue实现路由懒加载
92 2
|
3月前
|
前端开发 JavaScript
React项目路由懒加载lazy、Suspense,使第一次打开项目页面变快
本文介绍了在React项目中实现路由懒加载的方法,使用React提供的`lazy`和`Suspense`来优化项目首次加载的速度。通过将路由组件改为懒加载的方式,可以显著减少初始包的大小,从而加快首次加载速度。文章还展示了如何使用`Suspense`组件包裹`Switch`来实现懒加载过程中的fallback效果,并提供了使用前后的加载时间对比,说明了懒加载对性能的提升作用。
243 2
React项目路由懒加载lazy、Suspense,使第一次打开项目页面变快
|
1月前
|
前端开发 API UED
React 懒加载图片 Lazy Image
懒加载是一种优化技术,通过延迟加载不在视口内的图片,减少初始页面加载时间,提升用户体验。本文从基础概念入手,逐步探讨 React 中实现图片懒加载的常见问题、易错点及解决方案,并通过代码案例详细解释。
43 3
|
2月前
|
人工智能 自然语言处理 前端开发
SpringBoot + 通义千问 + 自定义React组件:支持EventStream数据解析的技术实践
【10月更文挑战第7天】在现代Web开发中,集成多种技术栈以实现复杂的功能需求已成为常态。本文将详细介绍如何使用SpringBoot作为后端框架,结合阿里巴巴的通义千问(一个强大的自然语言处理服务),并通过自定义React组件来支持服务器发送事件(SSE, Server-Sent Events)的EventStream数据解析。这一组合不仅能够实现高效的实时通信,还能利用AI技术提升用户体验。
223 2
|
1月前
|
前端开发 JavaScript
手敲Webpack 5:React + TypeScript项目脚手架搭建实践
手敲Webpack 5:React + TypeScript项目脚手架搭建实践
|
2月前
|
缓存 前端开发 UED
React Suspense 懒加载详解
【10月更文挑战第18天】React Suspense 是 React 16.6 引入的新特性,主要用于处理异步数据获取和组件懒加载。本文从 Suspense 的基本概念出发,介绍了其在代码分割和数据获取中的应用,通过具体代码示例展示了如何使用 `React.lazy` 和 `Suspense` 实现组件的懒加载,并探讨了实践中常见的问题及解决方法,帮助开发者提升应用性能和用户体验。
109 1
|
3月前
|
前端开发 JavaScript UED
深入React Hooks与性能优化实践
深入React Hooks与性能优化实践
54 0
|
4月前
|
移动开发 前端开发 JavaScript
使用React Native进行跨平台移动开发:技术探索与实践
【8月更文挑战第10天】React Native以其跨平台、高性能、易学习等优势,在移动开发领域取得了显著的成果。通过合理使用React Native,开发者可以更加高效地开发出高质量、低成本的移动应用。然而,在享受React Native带来的便利的同时,我们也需要关注其潜在的挑战和限制,并通过不断学习和实践来提升我们的开发能力。