[用户体验分析报告] React 按需加载组件,导致组件渲染卡顿,影响交互体验?组件拆包&预加载方案来了! - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
DDDDevin
V2EX    程序员

[用户体验分析报告] React 按需加载组件,导致组件渲染卡顿,影响交互体验?组件拆包&预加载方案来了!

  •  
  •   DDDDevin 2023-07-27 14:44:55 +08:00 1148 次点击
    这是一个创建于 811 天前的主题,其中的信息可能已经有所发展或是发生改变。

    首先,我们看一些针对《如何提升应用首屏加载体验》的文章,提到的必不可少的措施,便是减少首屏幕加载资源的大小,而减少资源大小必然会想到按需加载措施。本文提到的便是一个基于webpack 插件 react 组件实现的一套研发高度自定义、组件按需加载的资源预加载方案.

    为什么要做这么一套预加载方案呢?它存在的必要性在哪里?

    常规组件按需加载方案缺点

      1. React.lazy 组件按需加载 组件渲染时加载组件资源
    react.lazy(()=>import('xxxx/component')) 

    优点:拆分组件代码,按需加载, 减少首屏的资源加载,提升页面首屏速度。

      1. 组件动态加载 执行代码 import() 时加载组件资源
    useEffect(() => { import('xxxx/component').then((loadScript) => { }) }, []) 

    优点:拆分组件代码,开发者可以更细粒度地控制组件按需加载的时机。

    二者共有缺点:

    代码拆分后,组件资源异步加载存在耗时,视觉上会渲染出 React.Suspensefallback 以处理加载资源时的页面展示问题,当组件资源特别大或网络不稳定时都有可能会出现 loading 时间过长以致于影响用户体验

    如图:

    image.png

    image.png

    由于资源加载存在近4s的耗时,组件渲染被延迟,这种情况下,便导致了我们虽然通过减少了首屏资源提升了首屏加载体验,但却让用户在后续使用过程中出现了体验断层,甚至是页面白屏的情况,这是用户不能接受的。

    懒加载&预加载方案&流程介绍

    预加载的目的让被懒加载的组件资源提前进行对应的资源请求,而不是渲染时请求, 本文为大家介绍的是基于 route-resource-preload 实现的一套加载时机高度自定义的资源预加载方案。

    该方案基于 @route-resource-preload/webpack-plugin@route-resource-preload/react, 分别对应构建时运行时:

    构建时流程图: 构建时流程图

    构建时 通过 dynamic API 及 webpack plugin 对模块进行拆包的同时,还会将preloadKey(开发者自定义的预加载标识)import-module-url(import 模块路径)module(output 产物)三者之间的关系以json形式进行保存,并允许应用端访问。

    生成的 JSON 文件: image.png JSON: image.png

    开发者基于 JSON,可以判断出你想进行预加载的资源应该分类到哪个preloadKey下及preloadKeymodule间的映射关系。

    运行时流程图: 运行时流程图 运行时 则是基于构建出的json,开发者通过设置Preloader/PreloadLinkpreloadKey,对应的相关资源将被预加载,并基于 dynamic API 渲染组件。

    项目效果演示

    1. 真实用户场景打开 Modal ( Modal 基于 webpack module federation 引入)体验模拟

    • 无预加载时:点击按钮后,拉取对应的拆包资源及远程 module federation 组件资源,请求完成后渲染组件,存在体验卡顿

    iShot_2023-07-20_18.25.23.gif

    • 有预加载时:hover 到某个区域/某个组件渲染时(开发者自定义)即可触发资源预加载,点击按钮后立即渲染组件,不存在体验卡顿。

    iShot_2023-07-20_18.34.29.gif

    2. 离线场景体验模拟

    为了对比效果(有/无预加载)更加直观,以下将采用离线网络的场景下进行展示。

    • 无预加载时:按需加载在离线网络环境下会白屏。

    iShot_2023-07-18_20.09.55.gif

    • 有预加载时:按需加载在离线网络环境下页面渲染体验正常,即实现拆包按需加载的用户体验等同于未拆包

    iShot_2023-07-18_22.20.38.gif

    预加载机制存在的必要性

    通过以上的预加载机制,基于拆包不影响用户体验的前提下,便能够通过应用内 Any code can be split (一切代码都可以被拆包),让开发者没有了因为单页面资源过大影响应用性能的烦恼,SPA(单页面应用) 也可以拥有极致的首屏幕加载体验和交互体验,与掌兼得。

    在线体验 DEMO 地址
    效果数据对比

    目前尚无回复
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5531 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 29ms UTC 06:33 PVG 14:33 LAX 23:33 JFK 02:33
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86