React.lazy() 懒加载

概要

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)监控应用的加载性能,并发现其评分较低,代码分割可能是一个有效的优化方案

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Markdown快速上手(typora)

一级标题~六级标题 可以选中文本在这里直接设置&#xff0c;后面也有快捷键&#xff0c;也可以使用其语法&#xff0c;一个#&#xff0c;对应一级标题&#xff0c;两个#&#xff0c;对应二级标题&#xff0c;等。 我这里使用Ctrl1没生效是因为快捷键冲突&#xff0c;也需要注意…

一招解决Mac没有剪切板历史记录的问题

使用Mac的朋友肯定都为Mac的剪切功能苦恼过&#xff0c;旧内容覆盖新内容&#xff0c;导致如果有内容需要重复输入的话&#xff0c;就需要一次一次的重复复制粘贴&#xff0c;非常麻烦 但其实Mac也能够有剪切板历史记录功能&#xff0c;iCopy&#xff0c;让你的Mac也能拥有剪切…

在鱼皮的模拟面试里面学习有感

文章目录 1.上半场1.1.引言1.2.鱼皮的建议 2.下半场2.1中间问题 3.我的总结3.1我的体会3.2我的计划 1.上半场 今天的直播&#xff0c;第一次全程的跟下来&#xff1a;也算是放松一下~~ 1.1.引言 上半场是后来总结的&#xff0c;听的时候没有随手记录&#xff1a; 1&#xf…

windows在两台机器上测试 MySQL 集群实现实时备份

在两台机器上测试 MySQL 集群实现实时备份的基本步骤&#xff1a; 一、环境准备 机器配置 确保两台机器&#xff08;假设为服务器 A 和服务器 B&#xff09;能够互相通信&#xff0c;例如它们在同一个局域网内&#xff0c;并且开放了 MySQL 通信所需的端口&#xff08;默认是 …

MQTT从入门到精通之MQTT入门

MQTT入门 1 MQTT概述 1.1 MQTT简介 MQTT&#xff08;Message Queuing Telemetry Transport&#xff09;由IBM于1999年开发的一种基于**"发布订阅模式"的轻量级的消息传输协议**&#xff01; 发布订阅模式是一种传统的客户端-服务器架构的替代方案&#xff0c;因为…

python在word中插入图片

本文讲解python如何在word文档中插入图片&#xff0c;以及指定插入图片的段落。 1、在新建的word文档中插入图片 import win32com.client as win32 from win32com.client import constants # 1&#xff09;打开word应用程序 doc_app win32.gencache.EnsureDispatch(Word.App…

Linux(CentOS)安装 Nginx

CentOS版本&#xff1a;CentOS 7 Nginx版本&#xff1a;1.24.0 有两种安装方式 一、通过编译源码包安装 编译源码包&#xff1a;.tar.gz或.tar包文件 1、下载 Nginx 打开Nginx官网&#xff1a;https://nginx.org/ 2、上传 Nginx 文件到 CentOS 使用FinalShell远程登录工…

TESSY学习笔记—project view界面的架构

1&#xff1a;project view界面能添加的元素 project view界面能添加的元素&#xff08;暂且称为元素&#xff09;&#xff0c;打开project view界面&#xff0c;下图中红框勾选出来的就是 2&#xff1a;一共存在5种可添加元素 **1&#xff09;Test collection 测试集合&…

vue中如何关闭eslint检测?

ESLint作为一个用于JavaScript代码的验证工具&#xff0c;主要用于检查代码语法和编码规范。本文旨在指导那些希望在Vue.js项目中禁用ESLint验证功能的用户。对于需要这一操作的朋友&#xff0c;以下内容将提供参考。 vue中如何关闭eslint检测&#xff1f; 有了eslint的校验&…

uniApp之uni-file-picker使用踩坑

标题党~也不算坑吧 就是初体验 上传是需要存储一下子的&#xff0c;我以为uniApp是自己免费开的服务给大家中转使用&#xff0c;就没管这个事&#xff0c;但是官网是这么说的&#xff1a; 就我是怎么发现的&#xff0c;使用了一段时间后&#xff0c;上传的图片都裂了&#xff…

K8s小白入门

文章目录 前言一、特性二、集群的结构控制平面内部组件Node内部组件 三、Docker与K8s的关系总结 前言 Kubernetes&#xff08;K8s&#xff09;是一个开源的容器编排平台&#xff0c;用于自动化容器化应用的部署、扩展和管理。是支持云原生部署的一个平台&#xff0c;它前生是谷…

[asdf] 管理erlang 版本--ubuntu 16.04

部分网址 asdf 官网&#xff1a;快速入门 | asdf elang 插件网址&#xff1a;https://github.com/asdf-vm/asdf-erlang rebar 插件网址&#xff1a;https://github.com/Stratus3D/asdf-rebar 安装asdf 先安装依赖,默认装了git 可只安装curl apt install curl git 2、安装as…

微信小程序 uniapp网络记账设计个人理财系统

文章目录 项目介绍具体实现截图技术介绍mvc设计模式小程序框架以及目录结构介绍错误处理和异常处理java类核心代码部分展示详细视频演示源码获取 项目介绍 aa账簿 (自动编号、用户id、用户账号、备注、登记时间、消费类型、创建时间、消费金额)&#xff1b; 配置文件 (自动编…

【VR】PICO 手部追踪 steamvr内无法识别,依旧识别手柄的解决方案

一、问题描述 && 原因分析 1.PICO4 手部追踪 steamvr内无法识别&#xff0c;依旧识别手柄的解决方案 尽管平放&#xff08;或关闭手柄连接&#xff09;之后&#xff0c;在 PICO 一体机中进入了手部追踪状态&#xff0c; 但只要进入 steamvr&#xff0c;就无法正确识别…

React中类组件和函数组件的理解和区别

react代码模块分为类组件和函数组件。 从语法和定义、内部状态管理、生命周期、性能、可读性和维护性、上下文、集成状态管理库等角度对比React中类组件和函数组件。 1、语法和定义 类组件&#xff1a; 使用 ES6 的类&#xff08;class&#xff09;语法定义的 React 组件。…

ruoyi-vue集成tianai-captcha验证码

后端代码 官方使用demo文档&#xff1a;http://doc.captcha.tianai.cloud/#%E4%BD%BF%E7%94%A8demo 我的完整代码&#xff1a;https://gitee.com/Min-Duck/RuoYi-Vue.git 主pom.xml 加入依赖 <!-- 滑块验证码 --><dependency><groupId>cloud.tianai.captc…

ctfshow(316)--XSS漏洞--反射性XSS

Web316 进入界面&#xff1a; 审计 显示是关于反射性XSS的题目。 思路 首先想到利用XSS平台解题&#xff0c;看其他师傅的wp提示flag是在cookie中。 当前页面的cookie是flagyou%20are%20not%20admin%20no%20flag。 但是这里我使用XSS平台&#xff0c;显示的cookie还是这样…

move_base

move_base 官方介绍&#xff1a;http://wiki.ros.org/move_base 如果在仿真环境下&#xff0c; sensor source、odometry source 和 sensor transforms 都已提供好&#xff0c;我们只需要完成以下部分&#xff1a; 一、编写导航程序 ①创建 ROS 工作空间 和 pkg 包 mkdir -p …

探索开放资源上指令微调语言模型的现状

人工智能咨询培训老师叶梓 转载标明出处 开放模型在经过适当的指令调整后&#xff0c;性能可以与最先进的专有模型相媲美。但目前缺乏全面的评估&#xff0c;使得跨模型比较变得困难。来自Allen Institute for AI和华盛顿大学的研究人员们进行了一项全面的研究&#xff0c;探索…

微信小程序uniapp基于Android的流浪动物管理系统 70c3u

文章目录 项目介绍具体实现截图技术介绍mvc设计模式小程序框架以及目录结构介绍错误处理和异常处理java类核心代码部分展示详细视频演示源码获取 项目介绍 以往流浪猫狗的救助网站相关信息的管理&#xff0c;都是工作人员手工统计。这种方式不但时效性低&#xff0c;而且需要查…