React 中的延迟加载

ops/2024/9/22 19:25:07/

延迟加载是 Web 开发中的一种有效的性能优化技术,尤其是对于 React 等库和框架。它涉及仅在需要时加载组件或资源,无论是响应用户操作还是当元素即将在屏幕上显示时。这可以减少应用程序的初始加载时间,减少资源消耗,并改善用户体验,尤其是在性能有限或 Internet 连接速度较慢的设备上。

延迟加载在 React 中是如何工作的

React 主要通过 React.lazy 函数实现延迟加载。它通常与 React.Suspense 结合使用,后者处理加载状态和回退 UI。以下是了解如何在 React 应用程序中实现延迟加载的关键步骤。

1. 使用 React.lazy 动态导入 

React.lazy 仅在需要时启用组件的动态导入。结果是一个 Promise,它解析为包含默认 React 组件的模块。

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

在这个例子中,DelayedComponent 仅在 React 第一次尝试渲染它时加载。

2. 使用 React.Suspense 包装

为了处理加载状态,使用 React.Suspense 来包装延迟加载的组件。这允许您在组件加载时显示回退内容(例如, Loading组件)。

import React, { Suspense } from 'react';function App() {return (<div><Suspense fallback={<div>Loading content...</div>}><DelayedComponent /></Suspense></div>);
}

在上面的代码片段中,<Suspense>等待 DelayedComponent 加载后再显示它。如果加载需要时间,用户将看到“正在加载内容...”。

3. 错误处理

使用延迟加载时,在发生故障(例如,网络中断)时,错误处理是必不可少的。如果在加载过程中出现问题,您可以显示错误消息或回退组件。

4. 与 Routing 集成

延迟加载在路由上下文中特别有用,在路由上下文中,根据 URL 加载不同的屏幕或组件。使用像 React Router 这样的路由器,你可以使用 React.lazy 为每个路由动态加载组件。

import { BrowserRouter as Router, Route, Switch } from 'react-router-dom';
import React, { Suspense } from 'react';const HomeView = React.lazy(() => import('./HomeView'));
const AboutView = React.lazy(() => import('./AboutView'));function App() {return (<Router><Suspense fallback={<div>Loading views...</div>}><Switch><Route path="/about" component={AboutView} /><Route path="/" component={HomeView} /></Switch></Suspense></Router>);
}

在这种情况下,HomeView 和 AboutView 仅在访问各自的路由时加载。

为什么延迟加载很有用?

  • 更快的初始加载:通过首先仅加载应用程序的基本部分,可以减少初始加载时间。
  • 减少资源使用:延迟加载仅在需要时加载组件,从而有助于节省带宽和系统资源。
  • 改进的用户体验: 用户可以获得更快的响应,因为他们不必等待所有内容加载完后即可与应用程序交互。

延迟加载解决的问题

  • 初始加载时间慢:当应用程序具有许多组件或繁重的库时,延迟加载会拆分代码并仅加载当时需要的内容。
  • 不必要的资源消耗:推迟加载应用程序的非关键部分可以提高性能并节省资源。

延迟加载和代码拆分

React 中的延迟加载通常与代码拆分携手工作,其中应用程序被拆分成更小的捆绑包。像 Webpack 这样的现代 JavaScript 打包器可以自动处理这种拆分。将代码拆分与延迟加载相结合可确保仅提供当前视图所需的代码,从而优化性能。

结论

延迟加载和代码拆分是增强 Web 性能的强大工具,因此它们对于构建快速响应的应用程序至关重要。通过延迟加载非必要资源并仅在需要时处理它们,您可以显着改善 React 项目中的用户体验和资源管理。


http://www.ppmy.cn/ops/114386.html

相关文章

Ubuntu 不重装系统增加交换空间大小

目录 一、设置交换文件 二、删除重新创建交换文件 一、设置交换文件 1、创建新的交换文件 使用 dd 命令创建一个新的交换文件。例如&#xff0c;创建一个4GB的交换文件&#xff1a; sudo dd if/dev/zero of/swapfile bs1G count4 2、设置交换文件的权限 为了安全起见&am…

分享课程:云LAN到家视频教程

云LAN到家项目包括四个端&#xff1a;用户端(小程序)、服务端&#xff08;app&#xff09;、机构端(PC)、运营管理端(PC)&#xff0c; 四个端对应四类用户角色&#xff1a; 家政需求方&#xff1a;通过用户端小程序完成在线预约下单、支付、评价、投诉、退款等操作。 家政服务人…

Python在数据科学与机器学习中的应用

Python 是数据科学与机器学习领域的首选语言之一&#xff0c;广泛应用于数据处理、分析、建模以及预测任务中。Python 拥有丰富的库和工具&#xff0c;能够帮助开发者高效处理数据&#xff0c;并构建各种机器学习模型。下面我们将详细介绍 Python 在数据科学与机器学习中的应用…

【MySQL】MySQL连接池原理与简易网站数据流动是如何进行

一、MySQL连接池 我们在基础I/O中学习了线程池&#xff0c;因此&#xff0c;我们可以将MySQL引入线程池中。如果在实际业务中出现频繁连接数据库的情况时&#xff0c;我们需要创建一些线程&#xff0c;然后通过线程来创建MySQL的连接。在每一个线程中&#xff0c;我们线程启动前…

UniApp一句话经验: px -> rpx动态转换和动态元素区域的获取

px->rpx转换 在多终端条件下&#xff0c;什么devicePixelRatio&#xff0c;upx2px都是不靠谱的&#xff0c;最直接的是这样&#xff1a; const { screenWidth } uni.getSystemInfoSync()const pixelUnit screenWidth / 750 // rpx->px比例基数 动态元素区域获取 多终…

SAP学习笔记 - 开发06 - CDSView + Fiori Element 之 List Report

上一章讲了Fiori UI5开发环境搭建和实践&#xff1a; - VSCode 安装Fiori Tools插件 - SEGW 创建后台程序&#xff0c;注册服务&#xff0c;Gateway Client确认服务 - 使用SEGW公开的服务来查询数据显示到页面 SAP学习笔记 - 开发05 - Fiori UI5 开发环境搭建2 Fiori Tools…

『功能项目』窗口可拖拽脚本【59】

本章项目成果展示 我们打开上一篇58第三职业弓弩的平A的项目&#xff0c; 本章要做的事情是给坐骑界面挂载一个脚本让其显示出来的时候可以进行拖拽 创建脚本&#xff1a;DraggableWindow.cs using UnityEngine; using UnityEngine.EventSystems; public class DraggableWindo…

etcd 集群搭建与测试指南

etcd 集群搭建与测试指南 一、容器搭建 1. 拉取 etcd 镜像 首先&#xff0c;需要从 Docker Hub 拉取 etcd 的镜像&#xff1a; docker pull quay.io/coreos/etcd:v3.3.12. 创建自定义网络 为了设置容器的固定 IP&#xff0c;需要创建一个自定义网络&#xff1a; docker n…