拆分代码 + 预加载,减少首屏资源,提升首屏性能及应用体验

news2024/11/26 11:31:25

route-resource-preload

image.png

组件懒加载可以极大地提升我们的应用首屏加载体验, 但我们在进行组件资源拆包后,一旦加载某个组件资源出现以上时间过长的情况,则会出现视图无法正常渲染的问题(导致页面白屏/组件出不来/交互卡顿等情况)。

🚀 route-resource-preload 可以解决掉拆包体积大网络波动以至于组件加载时间过长导致的用户体验异常的问题, 基于其中的预加载机制可以做到不影响用户最佳体验的同时,提升应用首屏加载速度,实现应用内 - Any code can be split,灵感来自NextJS的预加载.

gif 实际效果对比图

react.lazy 正常拆包并加载效果.gif

nornal-load (2).gif

route-resource-preload 拆包并预加载效果.gif

preoload.gif

从上图可以发现,route-resource-preload 预加载后,视图上基本不会再出现 loading 的情况,相对于react.lazy的 loading 时长,用户体验层面上有了较大的提升。

为什么你需要 route-resource-preload ?

  • 拆分模块按需加载,提升应用首屏加载体验.
  • 尽最大努力地去缩短动态导入组件的加载时间(可以看作是 suspense loading 组件持续时间)以提供最佳交互体验.
  • 支持自动预加载资源(JS / Component / Module-Federation / UMD / Svg / Png 等).
  • 支持手动调用预加载.
  • 完备的 typescript 支持.

route-resource-preload 与 react.lazy 有什么不同?

route-resource-preload 在兼顾组件代码分割的同时,通过支持对组件的自动预加载手动预加载,避免因为组件渲染延迟导致组件交互体验差(可以看作是 suspense loading 持续时间,基于预加载,可以让 loading 持续时间降至最低,避免影响用户体验)。

route-resource-preload 与 webpack-prefetch/preload 或 loadable-component 有什么不同?

  • 可以更细节(鼠标 hover 时加载、出现在视图内时加载、visible 时加载、页面初始化时加载)处控制何时何处进行资源预加载
  • 支持预加载Module-Federation
  • 支持预加载更多静态资源类型

什么是 module-federation ?
你可以将它看作一种动态加载的模块化机制,基于这种机制,可以方便的实现模块共享微前端,微前端 DEMO; 微前端中状态管理与事件通信怎么做?笔者提供了一种基于zustand跨应用、跨框架(react/vue)进行外部状态管理的方案 - zustand-pub ,感兴趣的同学可以了解下,如有缺点,还望指出/讨论。

常规组件使用效果对比

正常懒加载(react.lazy)普通组件 及 Module-Federation

WX20230424-113712.png

route-resource-preload 预加载普通组件 及 Module-Federation

WX20230424-113747.png

加载耗时如下:

资源正常懒加载 - react.lazy (ms)预加载 (ms)
普通组件 (单个资源文件)1841
Module-Federation 组件 (6个资源文件)4058

从表中可以看出,route-resource-preload 预加载显着提升了组件的加载速度,尤其是对于复杂的组件,加载速度的提升更为明显。 这说明在复杂的业务场景下,预加载可以显着提升组件加载速度和用户体验.

以上是常规组件预加载时的对比效果

模态弹窗组件使用效果对比

模态弹窗被常规的方式(如 react.lazy)进行懒加载时,由于是渲染在视图内,会自动进行资源加载,基于route-resource-preload ,可以让模态弹窗组件 visible 为 true 时,才进行资源加载,为 false 时,不自动加载以减少应用首屏 http 请求数,同时基于预加载机制,在保证页面性能的同时,不影响用户对模态弹窗的交互体验。

正常懒加载模态弹窗

WX20230424-113542.png

route-resource-preload 预加载模态弹窗

WX20230424-113600.png

此处有两个http请求,是因为预加载配置了两个组件。

const Modal = useMemo(()=> dynamic({
    visible, // false 时,即使组件渲染在视图内,但不自动进行资源预加载,减少首屏非必要的 http 请求
    loader: () => import('antd/es/modal'),
    loading: () => <>loading...</>,
}),[visible])

<>
    <Modal visible={visible} />
    <PreloadLink flag="/A" onClick={()=>{setVisible(true)}}>       
        PreLoad Modal
    </PreloadLink>
</>
new RouteResourcePreloadPlugin({
    modulePreloadMap: {
      "/A": ["../components/A",'antd/es/modal']
    }
})

加载耗时如下:

资源正常懒加载(ms)预加载 (ms)
模态弹窗 (单个资源文件)27145

总结

route-resource-preload 的目标是Any code can be split,在不影响用户交互体验的同时,尽可能的提升应用性能`。🚀 🚀 🚀

希望 route-resource-preload 能对你的项目有所帮助,后续还将持续探索 vite 中的使用以及对 vue 的支持,如果你有好的想法,请发表在此。

在线体验

react demo 源码

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

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

相关文章

Pytest教程__钩子方法setup、teardown、setup_class、teardown_class(8)

pytest跳过用例执行的用法与unittest跳过用例大致相同。 pytest跳过用例的方法如下&#xff1a; pytest.mark.skip(reason)&#xff1a;无条件用例。reason是跳过原因&#xff0c;下同。pytest.mark.skipIf(condition, reason)&#xff1a;condition为True时跳过用例。 pyte…

代码随想录算法训练营第五十八天|739. 每日温度|496.下一个更大元素 I

LeetCode739. 每日温度 基本思路&#xff1a;什么时候使用单调栈呢&#xff1f;通常是一维数组&#xff0c;要寻找任一个元素的右边或者左边第一个比自己大或者小的元素的位置&#xff0c;此时我们就要想到可以用单调栈了。时间复杂度为O(n)。例如本题其实就是找找到一个元素右…

【发电厂】发电厂模型验证应用于电网事件在线性能监测【相量测量单元 (PMU) 数据对电网事件的在线性能监控】研究(MatlabSimulink实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

(一文详解!)wrk性能测试

目录 一、简介 二、格式及用法 三、简单压测及结果分析 四、使用lua脚本进行压测 一、简介 wrk 是一款针对 Http 协议的基准测试工具&#xff0c;它能够在单机多核 CPU 的条件下&#xff0c;使用系统自带的高性能 I/O 机制&#xff0c;如 epoll&#xff0c;kqueue 等&#xff0…

华为OD机试真题 JavaScript 实现【报数游戏】【2022Q4 100分】

一、题目描述 100个人围成一圈&#xff0c;每个人有一个编码&#xff0c;编号从1开始到100。他们从1开始依次报数&#xff0c;报到为M的人自动退出圈圈&#xff0c;然后下一个人接着从1开始报数&#xff0c;直到剩余的人数小于M。请问最后剩余的人在原先的编号为多少&#xff…

Ubuntu 更新 CMake 版本

项目中有时候会出现CMake版本小于最低要求的情况,实际上没有有必要这么高的要求,但是在不能改对方代码的情况下,只能去升级自身的版本了. 尝试了网上说的直接update之后再次安装的方式,结果版本号没有改变 sudo apt-get update sudo apt-get remove cmake sudo apt-get ins…

Rust语言从入门到入坑——(3)小谈Cargo工具以及VScode配置Rust

文章目录 0 引入1、Cargo 是什么2、常用Cargo指令3、VScode配置Rust环境3.1.tasks.json3.2.launch.json 4、总结 0 引入 上一节我们谈了在编译工程的时候用到Cargo&#xff08;卡狗&#xff09; 1、Cargo 是什么 Cargo 是 Rust 的构建系统和包管理器。 Rust 开发者常用 Carg…

Metricbeat安装下载,nginx模块使用

目录 MetricbeatMetricbeat组成下载启动Metricbeat Modulesystem module配置内容 Nginx Module开启Nginx Module 配置nginx module测试 Metricbeat 定期收集操作系统或应用服务的指标数据存储到Elasticsearch中&#xff0c;进行实时分析 Metricbeat组成 Metricbeat有2部分组成…

Jmeter性能测试步骤入门

目录 前言&#xff1a; 一、Jmeter简介 1 概述 2 JMeter支持的协议 二、Jmeter实现性能测试 第一步&#xff1a;配置jdk环境 第二步&#xff1a;下载jmeter 第三步&#xff1a;启动Jmeter 四、一个http还除了上述http请求中的请求行和请求体&#xff0c;还包含请求头&#xff…

Android使用AspectJ拦截点击事件

介绍&#xff1a; AspectJ是一种AOP框架&#xff0c;它可以在编译时或运行时拦截指定的方法。在Android开发中&#xff0c;我们可以使用AspectJ来拦截UI事件并执行自己的业务逻辑。本文将说明如何使用AspectJ来拦截Android应用程序中的点击事件&#xff0c;并附有详细的代码注…

存储池和LUN

存储池是什么意思 存储池是为集体存储共享置备的存储卷的集合。这些池建立在物理存储设备的聚合上&#xff0c;根据资源需求进行隔离&#xff0c;然后由共享环境中的各种计算机或系统使用。存储池可以分为三类&#xff0c;每类都有不同的用途;主存储池、副本存储池和活动数据池…

618来了!看图技术如何在物流管理系统大显身手!

导读 近日&#xff0c;随着电商“618”购物节的临近&#xff0c;各大商家纷纷推出各类补贴活动刺激消费者热情。下单后&#xff0c;消费者的心理活动如何呢&#xff1f;蹲点抢到优惠券&#xff0c;精打细算的凑单后&#xff0c;终于完成付款。焦急的等待待发货的小红点跳至待收…

分享三个java低代码开发平台,每个都很能打,建议收藏!

来讲讲近期比较流行的低代码开发平台一词。低代码的目的是将可重复性的编程工作通过平台实现&#xff0c;将开发人员从没有技术含量的增删改查开发中解放出来&#xff0c;让其专注于更有价值的开发工作&#xff0c;例如业务建模、数据库设计、流程设计、API核心开发、业务逻辑开…

如何调用百度地图API

前言 要调用百度地图API&#xff0c;步骤操作如下 注册并创建一个API密钥。您可以在百度地图API控制台上创建您的密钥。选择要使用的API服务。百度地图API提供了多种服务&#xff0c;包括地图展示、路线规划、地点搜索、实时交通等。您可以在百度地图API控制台上查看所有可用…

大数据hadoop生态技术简介

Hadoop 生态是指围绕 Hadoop 大数据处理平台形成的一系列开源软件和工具&#xff0c;用于支持大规模数据处理、存储、管理、分析和可视化等应用场景。暂时将其核心技术分为9类&#xff1a; 数据采集技术框架&#xff1a; Flume、Logstash、FileBeat&#xff1b;Sqoop和Datax&…

【Spring】循环依赖

一、什么情况下会出现循环依赖&#xff1f; 二、解决方案 &#xff08;一&#xff09;一级缓存&#xff1a;存放完整的Bean实例对象 缺点&#xff1a;一级缓存的方式无法保证多线程下的一级缓存Bean的完整性&#xff0c;可以用加锁的方式来解决此问题。 &#xff08;二&#…

Nerf如何制作自己的llff数据集

Nerf三维重建使用Pycharm运行自己的数据集 ------------------------------------20230427更新---------------------------------------------- Nerf代码讲解&#xff0c;从零简单复现论文代码 Nerf环境配置教程 你好&#xff01; 这里是“出门吃三碗饭”本人&#xff0c;本…

数字化时代,数据治理中有哪些误区?

数据治理也不是什么简单的事情&#xff0c;或者说企业想要利用数据资产、数字化、数字化转型等加速企业的发展&#xff0c;就势必会在路途中遇到很多困难&#xff0c;数据治理只是用来解决数据问题的一种方案。所以当数据的价值开始被不断挖掘&#xff0c;企业数据资产的地位越…

分析了上百份最新的大中小厂的面经,我总结出了这份2023国内最新最强Java面试八股文

最近分析了上百份最新的大中小厂的面经&#xff0c;整理了 Java 面试中最最最常问的一些问题&#xff01;大家可以对照着这篇文章学习或者准备面试。 开始之前&#xff0c;先说一下我非常推荐的一种学习方式&#xff1a; 带着问题学习或者准备面试。 之前分享过一位字节朋友的…

数据预处理:标准化、正则化、最大最小归一化、绝对值标准化

https://scikit-learn.org/stable/modules/preprocessing.html 标准化 公式 &#xff1a; 优点&#xff1a;适用大多数类型的数据&#xff0c;标准化之后的数据是以0为均值&#xff0c;方差为1的正态分布 缺点 &#xff1a;是一种中心化方法&#xff0c;会改变原有数据得分…