江流天地外,山色有无中。
React.lazy
- lazy 能够让你在组件第一次被渲染之前延迟加载组件的代码。
- 延迟加载是一种仅在需要时加载 Web 应用程序部分的技术,而不是一次全部加载。这可以通过减少最初需要加载的代码量来提高应用程序的性能。
懒加载、预加载
- 懒加载
- 在需要的时候再去加载资源。
- 预加载
- 提前加载好下一步使用的资源
React.lazy 代码分割
- 进行代码分割能够帮助“懒加载”当前用户所需要的内容,能够显著地提高应用性能。尽管并没有减少应用整体的代码体积,但可以避免加载用户永远不需要的代码,并在初始加载的时候减少所需加载的代码量。
1 | import { Button, Modal } from 'antd'; |
- React.lazy 对比同步组件打包
- Modal组件文件被拆分打包为一个新的包(bundle)文件,并且只会在该组件渲染时,才会请求文件。
- 每次Modal点击都会不会重新加载DOM。
React.lazy 懒加载
- 在代码分割基础上,添加懒加载(点击Modal时才去请求分割的包文件,之前是组件加载时就请求文件)
1 | import { Button, Modal } from 'antd'; |
- 打开控制台,观察 Elements 和 Network, 打开Modal时,才请求代码分割文件。
- 缺陷:观察 Elements,每次Modal点击都会重新加载DOM。
1 | import { Button, Modal } from 'antd'; |
- 解决:添加一个判断是否渲染的变量
使用场景
- 具有多个路由的 React 应用程序中,可以使用React.lazy和 Suspense 组件为每个路由延迟加载组件。这可以通过仅在用户访问路由时加载路由代码来提高应用程序的性能。
1 | import { Route, Switch } from "react-router-dom"; |
- 多列表延迟加载
1 | import React, { Suspense, lazy } from "react"; |
React.lazy 源码
1 | export function lazy<T>( |
1 | // 核心的代码 |
- React.lazy本质就是 promise
- import 执行就是返回一个 promise 对象,Suspense 组件通过监听 promise 的状态进行选择渲染。比如执行成功后返回 moduleObject.default 组件的默认导出。