React.lazy() 懒加载

news2024/11/14 1:29:50

概要

React.lazy() 是 React 16.6 引入的一个功能,用于实现代码分割(code splitting)。它允许你懒加载组件,即在需要时才加载组件,而不是在应用初始加载时就加载所有组件。这种方法可以显著提高应用的性能,尤其是在大型应用中。

基本用法

React.lazy() 仅接受一个函数,该函数必须返回一个动态引入的模块(使用 import()

  • 懒加载组件

假设你有一个名为 MyComponent.js 的组件,你可以这样使用 React.lazy()

import React, { Suspense, lazy } from 'react';

// 使用 React.lazy() 懒加载组件
const MyComponent = lazy(() => import('./MyComponent'));

const App = () => {
  return (
    <div>
      <h1>我的应用</h1>
      <Suspense fallback={<div>加载中...</div>}>
        <MyComponent />
      </Suspense>
    </div>
  );
};

export default App;
  • 使用Suspense 

 懒加载组件时,必须使用 Suspense 组件来包裹懒加载的组件。Suspense 组件允许你定义一个 fallback 属性,这个属性是组件在加载过程中显示的内容。例如,可以显示一个加载指示器。

例如:如果不使用Suspense包裹组件,有可能遇到这种报错信息:

A component suspended while responding to synchronous input. This will cause the UI to be replaced with a loading indicator. To fix, updates that suspend should be wrapped with startTransition.

这个错误提示是因为在处理用户输入(如点击、键盘输入等)时,某个懒加载的组件(使用 React.lazy())被挂起了(suspended),导致 React 需要显示一个加载指示器。而这种情况通常是由于 React 在渲染期间遇到了懒加载组件,但该组件尚未加载完成。(通俗的说,是React使用了lazy之后,会存在一个加载中的空档期,React不知道在这个空档期中该显示什么内容,所以需要我们指定,所以就要使用到Suspense

  • 动态导入

使用动态导入(如 import() 语法)来实现代码分割,使得开发者可以在应用的不同部分按需加载模块,提高了代码的组织性和可维护性

原理解释

代码分割 — 优化 Web 应用性能的一种技术,主要目的是将大型应用程序的 JavaScript 代码拆分成更小的、按需加载的块。

为什么要代码分割?

现在前端项目基本都采用打包技术,比如 Webpack,JS逻辑代码打包后会产生一个 bundle.js 文件,而随着我们引用的第三方库越来越多或业务逻辑代码越来越复杂,相应打包好的 bundle.js 文件体积就会越来越大,因为需要先请求加载资源之后,才会渲染页面,这就会严重影响到页面的首屏加载。

1. 提高加载性能
  • 初始加载时间:当用户首次访问一个大型应用时,加载所有的 JavaScript 文件可能会导致较长的加载时间。通过代码分割,应用只会加载必要的代码,从而减少初始加载的体积。

  • 按需加载:代码分割允许应用在需要时才加载特定的代码块,比如当用户导航到某个特定的页面或触发特定的操作时。这种方式可以显著提高用户体验。

2. 资源优化
  • 减少资源浪费:在大型应用中,用户可能并不会访问所有的功能。通过代码分割,只加载用户实际需要的代码,可以减少不必要的资源消耗和带宽使用。

  • 缓存优化:将代码分割成多个小块也有助于利用浏览器的缓存机制。如果某个小块的代码发生变化,只有该块需要重新加载,而其他未改变的代码块可以继续使用缓存。

3. 更好的用户体验
  • 流畅的导航:通过懒加载(Lazy Loading)技术,可以实现更流畅的导航体验。当用户需要某个页面时,相关的代码可以在后台加载,减少等待时间。

  • 避免闪烁:当用户在应用中进行操作时,代码分割可以确保在加载新内容时不会出现大的延迟,从而增强用户体验。

什么时候应该考虑代码分割?

1. 大型应用
  • 复杂性:如果你的应用功能复杂、组件数量多,或者页面之间的依赖关系复杂,代码分割可以显著改善加载性能。大型应用通常会受益于将代码拆分成更小的块,只在需要时加载。
2. 首次加载时间过长
  • 用户体验:如果用户在首次访问应用时需要等待较长时间才能看到任何内容,那么应该考虑代码分割。通过只加载必要的代码,减少初始加载时间,可以提高用户体验。
3. 使用路由
  • 页面导航:如果你的应用使用了客户端路由(例如 React Router),可以考虑在用户导航到新页面时懒加载相关的页面组件。这种方式可以确保用户只加载他们正在访问的内容。
4. 资源优化
  • 带宽和性能:如果你的应用用户分布在不同的网络环境中,代码分割可以帮助优化资源使用,减少不必要的带宽消耗,尤其是在移动设备上。
5. 特定功能模块
  • 懒加载特性:如果你的应用有某些功能模块并不是所有用户都会使用(例如设置、报告、帮助等),可以将这些模块懒加载,以减少初始加载的负担。
6. 动态内容
  • 根据用户交互加载:如果你的应用的某些部分依赖于用户的交互(例如点击按钮、选择选项等),可以在用户触发这些交互时动态加载相关的代码。
7. 现代前端框架支持
  • 利用框架功能:许多现代前端框架(如 React、Vue、Angular 等)都提供了原生的代码分割和懒加载支持。如果你正在使用这些框架,应该考虑利用它们的功能来实现代码分割。
8. 提高开发效率
  • 团队协作:如果你的团队较大并且在开发大型应用,代码分割可以让不同的团队成员专注于各自的模块,而不必担心整体构建的复杂性。
9. 优化性能监测
  • 分析工具:如果你使用性能监测工具(如 Google Lighthouse 或 Web Vitals)监控应用的加载性能,并发现其评分较低,代码分割可能是一个有效的优化方案

注意:使用React.lazy() 后,组件会被 懒加载,并且会被 打包成一个独立的 chunk(即一个单独的 JavaScript 文件)。这样,只有在该组件被需要时,它才会被异步加载到浏览器中,从而减少初始页面的加载时间和资源消耗。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2239807.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

pgsql和mysql的自增主键差异

1. 当有历史数据存在时&#xff0c; mysql的自增主键是默认从最大值自增。 pgsql的自增主键取初始值开始逐个尝试&#xff0c;所以存在可能与历史数据的主键重复的情况。 pgsql解决上述问题的方式&#xff1a;重设自增值。 SELECT SETVAL(t_db_filed_id_seq, (SELECT MAX(&q…

Spring Cloud Contract快速入门Demo

1.什么是Spring Cloud Contract &#xff1f; Spring Cloud Contract 是 Spring 提供的一套工具&#xff0c;用于帮助开发者通过契约&#xff08;Contract&#xff09;驱动的方式进行微服务的测试和集成。它主要解决微服务之间通信时&#xff0c;如何确保服务提供者和消费者之…

OceanBase JDBC (Java数据库连接)的概念、分类与兼容性

本章将介绍 OceanBase JDBC的 概念与分类&#xff0c;已帮助使用 JDBC 的用户及技术人员更好的 了解JDBC&#xff0c;以及 OceanBase JDBC在与 MySQL 及 Oracle 兼容性方面的相关能力。 一、JDBC 基础 1.1 JDBC 的概念 JDBC 一般指 Java 数据库连接。Java 数据库连接&#xf…

自定义springCloudLoadbalancer简述

概述 目前后端用的基本都是springCloud体系&#xff1b; 平时在dev环境开发时&#xff0c;会把自己的本地服务也注册上去&#xff0c;但是这样的话&#xff0c;在客户端调用时请求可能会打到自己本地&#xff0c;对客户端测试不太友好. 思路大致就是前端在请求头传入指定ip&a…

Go/Golang语言各种数据类型内存字节占用大小和最小值最大值

具体请前往&#xff1a;Go/golang语言基本数据类型字节大小和取值范围(最小值~最大值)

力扣104 : 二叉树最大深度

补&#xff1a;二叉树的最大深度 描述&#xff1a; 给定一个二叉树 root &#xff0c;返回其最大深度。二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 何解&#xff1f; 树一般常用递归&#xff1a;递到叶子节点开始倒着处理

Android GPU纹理数据拷贝

在 Android 开发中读取纹理数据有以下几种方法&#xff1a; glReadPixelsImageReaderPBO&#xff08;Pixel BufferObject&#xff09; HardwareBuffer 1. glReadPixels glReadPixels 是 OpenGL ES 的 API&#xff0c;通常用于从帧缓冲区中读取像素数据&#xff0c;OpenGL ES…

畅捷通T+ RecoverPassword.aspx

用友 畅捷通T RecoverPassword.aspx 存在未授权管理员密码修改漏洞&#xff0c;攻击者可以通过漏洞修改管理员账号密码登录后台 #漏洞影响版本 12.0&#xff0c;12.1.12.2.12.3 13.0 15.0 16.0 18.0 补丁号291都影响 19.0 补丁号167之前也有影响 对于老版本畅捷通已经…

最全最简单理解迭代器

1. 迭代器的基础概念(iterator) 1.1 本质 迭代器能够用来遍历容器的对象,与能够遍历数组的指针类似,是广义指针。 1.2 作用: 能够让迭代器与算法不干扰的相互发展,最后又能无间隙的粘合起来。重载了*,++,==,!=,=运算符。用以操作复杂的数据结构。容器提供迭代…

python数据写入excel文件

主要思路&#xff1a;数据 转DataFrame后写入excel文件 一、数据格式为字典形式1 k e &#xff0c; v [‘1’, ‘e’, 0.83, 437, 0.6, 0.8, 0.9, ‘好’] 1、这种方法使用了 from_dict 方法&#xff0c;指定了 orient‘index’ 表示使用字典的键作为行索引&#xff0c;然…

[CKS] Create/Read/Mount a Secret in K8S

最近准备花一周的时间准备CKS考试&#xff0c;在准备考试中发现有一个题目关于读取、创建以及挂载secret的题目。 ​ 专栏其他文章: [CKS] Create/Read/Mount a Secret in K8S-CSDN博客[CKS] Audit Log Policy-CSDN博客 -[CKS] 利用falco进行容器日志捕捉和安全监控-CSDN博客[C…

docker之容器设置开机自启(4)

命令语法&#xff1a; docker update --restartalways 容器ID/容器名 选项&#xff1a; --restart参数 no 默认策略&#xff0c;在容器退出时不重启容器 on-failure 在容器非正常退出时&#xff08;退出状态非0&#xff09;&#xff0c;才会重启容器 …

机器学习:决策树——ID3算法、C4.5算法、CART算法

决策树是一种常用于分类和回归问题的机器学习模型。它通过一系列的“决策”来对数据进行分类或预测。在决策树中&#xff0c;每个内部节点表示一个特征的测试&#xff0c;每个分支代表特征测试的结果&#xff0c;而每个叶节点则表示分类结果或回归值。 决策树工作原理 根节点&…

Angular 和 Vue2.0 对比

前言 &#xff1a;“业精于勤&#xff0c;荒于嬉&#xff1b;行成于思&#xff0c;毁于随” 很久没写博客了&#xff0c;大多记录少进一步探查。 Angular 和 Vue2.0 对比&#xff1a; 一.概念 1.1 Angular 框架&#xff1a; 是一款由谷歌开发的开源web前端框架&#xff08;核…

Python酷库之旅-第三方库Pandas(208)

目录 一、用法精讲 971、pandas.MultiIndex.set_levels方法 971-1、语法 971-2、参数 971-3、功能 971-4、返回值 971-5、说明 971-6、用法 971-6-1、数据准备 971-6-2、代码示例 971-6-3、结果输出 972、pandas.MultiIndex.from_arrays类方法 972-1、语法 972-2…

[Linux]:IO多路转接之epoll

1. IO 多路转接之epoll 1.1 epoll概述 epoll是Linux内核为处理大规模并发网络连接而设计的高效I/O多路转接技术。它基于事件驱动模型&#xff0c;通过在内核中维护一个事件表&#xff0c;能够快速响应多个文件描述符上的I/O事件&#xff0c;如可读、可写、异常等&#xff0c;…

Spring Security 认证流程,长话简说

一、代码先行 1、设计模式 SpringSecurity 采用的是 责任链 的设计模式&#xff0c;是一堆过滤器链的组合&#xff0c;它有一条很长的过滤器链。 不过我们不需要去仔细了解每一个过滤器的含义和用法,只需要搞定以下几个问题即可&#xff1a;怎么登录、怎么校验账户、认证失败…

API 接口进行多分支管理的方法

原文链接&#xff1a;API 接口进行多分支管理的方法

链表类算法【leetcode】

链表的定义 面试时&#xff0c;需要自己手写... // 单链表 struct ListNode {int val; // 节点上存储的元素ListNode *next; // 指向下一个节点的指针ListNode(int x) : val(x), next(NULL) {} // 节点的构造函数 }; 【构造函数可以省略&#xff0c;C默认生成一个构造函数…

重构开发之道,Blackbox.AI为技术注入智能新动力

本文目录 一、引言二、Blackbox.AI实战体验2.1 基于网页界面生成前端代码进行应用开发2.2 与AI助手实现实时智能对话2.3 重塑大型文件交互方式2.4 链接Github仓库进行对话编程 三、总结 一、引言 在生产力工具加速进化的浪潮中&#xff0c;Blackbox.AI开始崭露头角&#xff0c…