route-resource-preload 拆分代码,减少首屏加载资源,提供优质用户体验 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
DDDDevin
V2EX    前端开发

route-resource-preload 拆分代码,减少首屏加载资源,提供优质用户体验

  •  
  •   DDDDevin 2023-03-22 10:03:31 +08:00 1251 次点击
    这是一个创建于 939 天前的主题,其中的信息可能已经有所发展或是发生改变。

    route-resource-preload

    专注于不影响用户最佳体验的同时提升应用首屏加载速度,灵感来自NextJS 的预加载.

    gif 效果图

    正常懒加载.gif

    nornal-load.gif

    route-resource-preload 预加载.gif

    preoload.gif

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

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

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

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

    route-resource-preload 在兼顾组件代码分割的同时,通过支持对组件的自动预加载手动预加载,避免因为组件渲染延迟导致组件交互体验差。

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

    常规组件使用效果对比

    正常懒加载普通组件 及 Module-Federation

    image.png

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

    image.png

    资源 正常懒加载(ms) 预加载 (ms)
    普通组件 (单个资源文件) 184 1
    Module-Federation 组件 (6 个资源文件) 405 8

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

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

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

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

    正常懒加载模态弹窗

    image.png

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

    image.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)
    模态弹窗 (单个资源文件) 271 45

    总结

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

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

    在线体验

    1 条回复    2023-04-21 22:58:26 +08:00
    houchangxiaowang
        1
    houchangxiaowang  
       2023-04-21 22:58:26 +08:00
    点个赞
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3003 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 13:06 PVG 21:06 LAX 06:06 JFK 09:06
    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