React.lazy() 懒加载

news/2024/11/8 16:21:41 标签: react.js, 前端, 前端框架

概要

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.niftyadmin.cn/n/5744142.html

相关文章

基于Springboot+Vue的网上课程学习系统(含源码数据库)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 该系统…

植物神经功能紊乱?这些维生素或许能帮到你!

植物神经功能紊乱&#xff0c;这个听起来有些陌生的名词&#xff0c;实际上却是一种常见的内脏功能失调综合征。它可能与心理、遗传、疾病等多种因素有关&#xff0c;表现为多个系统的症状&#xff0c;如睡眠障碍、心悸、头痛、胸闷、多汗等&#xff0c;严重影响了患者的生活质…

C语言实现数据结构之堆

文章目录 堆一. 树概念及结构1. 树的概念2. 树的相关概念3. 树的表示4. 树在实际中的运用&#xff08;表示文件系统的目录树结构&#xff09; 二. 二叉树概念及结构1. 概念2. 特殊的二叉树3. 二叉树的性质4. 二叉树的存储结构 三. 二叉树的顺序结构及实现1. 二叉树的顺序结构2.…

linux rocky 9.4部署和管理docker harbor私有源

文章目录 Harbor简介安装Harbor技术细节1.安装系统(略),设置主机名和IP2.安装docker3.安装docker-compose4.安装Harbor私有源仓库5 测试登录1.本机登录2.客户端登录Harbor服务器配置docker源1. 下载镜像2.把镜像上传到Harbor私有仓库源3.客户端下载镜像,并且启动容器linux …

简单分享一下淘宝商品数据自动化抓取的技术实现与挑战

在电子商务领域&#xff0c;数据是驱动决策的关键。淘宝作为国内最大的电商平台之一&#xff0c;其商品数据对电商从业者来说具有极高的价值。然而&#xff0c;从淘宝平台自动化抓取商品数据并非易事&#xff0c;涉及多重技术和法律挑战。本文将从技术层面分析实现淘宝商品数据…

如何选择最适合的消息队列?详解 Kafka、RocketMQ、RabbitMQ 的使用场景

引言 在日常开发中&#xff0c;消息队列已经成为业务场景中几乎不可或缺的一部分。无论是订单系统、日志收集、分布式事务&#xff0c;还是大数据实时流处理&#xff0c;消息队列都在支撑着这些关键环节。目前市面上常用的消息队列有三种(ActiveMQ 虽然在企业集成中仍有应用&a…

【ddnsgo+ipv6】

ddnsgoipv6 DNS解析添加记录ddnsgo配置 DNS解析添加记录 ddnsgo配置

面试:TCP、UDP如何解决丢包问题

文章目录 一、TCP丢包原因、解决办法1.1 TCP为什么会丢包1.2 TCP传输协议如何解决丢包问题1.3 其他丢包情况&#xff08;拓展&#xff09;1.4 补充1.4.1 TCP端口号1.4.2 多个TCP请求的逻辑1.4.3 处理大量TCP连接请求的方法1.4.4 总结 二、UDP丢包2.1 UDP协议2.1.1 UDP简介2.1.2…