为什么我重新写了一个 "react-lodable" ?

简单来说是为了通过配置 webpack 插件及少量业务代码即可实现Code Splitting + 组件懒加载 + 预加载

虽然react官方提供了一个 lazy API用于 react 组件的Code Splitting(代码拆分)组件懒加载

js 复制代码
const LazyComponent = React.lazy(() => import('./OtherComponent'))

lazy有一个局限就是必须放在<Suspense>组件内。

js 复制代码
import React, { Suspense } from 'react';
function MyComponent() {
  return (
    <div>
      <Suspense fallback={<div>Loading...</div>}>
        <LazyComponent />
      </Suspense>
    </div>
  );
}

同时,由于懒加载的关系,组件资源加载存在异步耗时,会导致<LazyComponent />在实际业务渲染中,存在较长的耗时,以至于组件渲染过程中出现闪烁体验卡顿等情况,影响用户体验,虽然<Suspense>有提供一个 fallback属于用于组件等待过程中进行渲染,但是交互体验相对于不使用lazy的情况下,体验是有变差的。

react社区提供的react-lodable 解决了以上两个问题:

  1. 不强依赖 react-lodable,可独立渲染<LazyComponent />
  2. 提供了preload预加载方案,减少异步加载耗时,保证用户体验。
js 复制代码
let LoadableMyComponent = Loadable(
  () => import('./another-component'),
  MyLoadingComponent,
);

class MyComponent extends React.Component {
  state = { showComponent: false };

  onClick = () => {
    this.setState({ showComponent: true });
  };

  onMouseOver = () => {
    LoadableMyComponent.preload();
  };

  render() {
    return (
      <div>
        <button onClick={this.onClick} onMouseOver={this.onMouseOver}>
          Show loadable component
        </button>
        {this.state.showComponent && <LoadableMyComponent/>}
      </div>
    )
  }
}

但是有个问题是模块过多时,侵入式的代码也变多了,同时被预加载的模块并没有进行统一管理,后续维护也不会很方便,不直观

那么是不是可以在webpack plugin层面对预加载的模块进行统一维护,同时减少了项目中的侵入式代码。

于是便有了 route-resource-preload, 其具备的特性:

  • 拆分模块按需加载,提升应用首屏加载体验.
  • 基于预加载缩短动态导入组件的加载时间(可以看作是 suspense loading 组件持续时间)以提供最佳交互体验.
  • 支持[自动预加载资源],如hover、某组件渲染时、出现在视图内时。(JS / Component / Module-Federation / UMD / Svg / Png 等).
  • 支持手动调用预加载.
  • 支持React <Suspense>,但不依赖。
  • 完备的 typescript 支持.

基于插件按模块对动态资源进行归类:

打包成JSON

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

自动预加载:

效果

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

体验地址:route-resource-preload.netlify.app/

希望本插件能为各位看客的业务赋能吧,鼓励使用,期待反馈~~~

相关文章:
为什么选 route-resource-preload 而不是 react.lazy ?
为什么预加载要选 route-resource-preload 而不是 react-lodable ?
🚀 拆分代码 + 预加载,减少首屏资源,提升首屏性能及应用体验
【用户体验分析报告】按需加载组件,导致组件渲染卡顿,影响交互体验?组件拆包&预加载方案来了! 🚀

相关推荐
正小安28 分钟前
如何在微信小程序中实现分包加载和预下载
前端·微信小程序·小程序
_.Switch2 小时前
Python Web 应用中的 API 网关集成与优化
开发语言·前端·后端·python·架构·log4j
一路向前的月光2 小时前
Vue2中的监听和计算属性的区别
前端·javascript·vue.js
长路 ㅤ   2 小时前
vite学习教程06、vite.config.js配置
前端·vite配置·端口设置·本地开发
长路 ㅤ   2 小时前
vue-live2d看板娘集成方案设计使用教程
前端·javascript·vue.js·live2d
Fan_web2 小时前
jQuery——事件委托
开发语言·前端·javascript·css·jquery
安冬的码畜日常2 小时前
【CSS in Depth 2 精译_044】第七章 响应式设计概述
前端·css·css3·html5·响应式设计·响应式
韩楚风3 小时前
【linux 多进程并发】linux进程状态与生命周期各阶段转换,进程状态查看分析,助力高性能优化
linux·服务器·性能优化·架构·gnu
莹雨潇潇3 小时前
Docker 快速入门(Ubuntu版)
java·前端·docker·容器
Jiaberrr3 小时前
Element UI教程:如何将Radio单选框的圆框改为方框
前端·javascript·vue.js·ui·elementui