React Suspense 应用场景及原理分析

874 阅读2分钟

React Suspense 应用场景及原理分析

Suspense和lazy()搭配实现代码分割

React.lazy()

顾名思义lazy()方法是用来对项目代码进行分割,懒加载用的.只有当组件被加载,内部的资源才会导入

为什么需要懒加载

在React的项目中import导入其他组件和库都是默认在初始直接导入的,webpack等打包工具会将import导入的文件直接合并到一个大文件中,如果项目很大,打包完后初始化加载时需要加载的文件会很大,这时候就需要代码分割

如何进行代码分割

在你的应用中引入代码分割的最佳方式是通过动态 import() 语法

静态导入:

import OtherComponent from './OtherComponent';


动态导入:

import("./OtherComponent").then(value => {
  console.log(value);
});

使用了动态导入之后,webpack检测到这种语法会自动代码分割,也就是压缩到两个文件里

React.lazy()就是对这个种动态导入方式的优化方法

React官网给出的用法


import React, { Suspense } from 'react';

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

function MyComponent() {
  return (
    <div>
      <Suspense fallback={<div>Loading...</div>}>
        <section>
          <OtherComponent />
          <AnotherComponent />
        </section>
      </Suspense>
    </div>
  );
}

fallback 属性接受任何在组件加载过程中你想展示的 React 元素。你可以将 Suspense 组件置于懒加载组件之上的任何位置。你也可以用一个 Suspense 组件包裹多个懒加载组件。

lazy()返回的是组件的Promise对象,当组件为pending时显示的是Suspensefallback的内容,只有resolve才显示加载好的组件,rejected时抛出错误。

这非常有助于缩减 bundle 的体积,并延迟加载在初次渲染时未用到的组件。

Suspense异步请求数据

目前在React 18中,您可以开始在像Relay、Next.js、 Hydrogen、 Remix这些框架中使用Suspense异步请求来获取数据。Ad hoc(即席查询)获取数据的方式在技术上是可行的,但仍不建议将其作为一般策略。

Suspense应用场景总结

第一种:动态导入组件(如上)

第二种:异步请求数据

优点

好处在于我们可以不用创建一些组件状态的变量来控制是否显示loading画面和真正组件,这部分逻辑直接由Suspense内部实现。

👍🏻还有一种场景就是当一个父组件中,有多个动态加载的组件,Suspense可以直接将loading状态聚合,只有当所有组件加载完成才显示,这里免去了多个loading的逻辑判断。