最近接到的另一个任务:优化项目里每个模块的加载速度!
我突发奇想,如果在用户还没点击跳转的情况下就将组件准备好,会不会更快一些了?
这篇我将介绍如何通过 react-lazy-with-preload
库提高页面的响应速度!
react-lazy-with-preload
扩展了 React.lazy
的功能,允许开发者在特定时机提前加载组件!
例如,在一个包含 /home
和 /about
页面的应用中,我们可以在用户将鼠标悬停在路由跳转的按钮时,预加载 About
组件。这样,当用户点击按钮时,页面可以立即渲染,无需等待组件加载!
实现这一效果非常简单。首先,使用 lazyWithPreload
替换 lazy
方法引入组件然后,在 Home
组件的按钮上添加 onMouseEnter
事件,触发预加载:
import { Suspense, useState } from"react";
import { BrowserRouter, Routes, Route, Link } from"react-router-dom";
import lazyWithPreload from"react-lazy-with-preload";
// 懒加载 About 组件
const About = lazyWithPreload(() =>import("./About"));
// Home 页面组件
function Home() {
const [isPreloading, setIsPreloading] = useState(false);
const handleMouseEnter = () => {
About.preload();
setIsPreloading(true);
};
const handleMouseLeave = () => {
setIsPreloading(false);
};
return (
<div>
<h1>Home Page</h1>
<Link to="/about">
<button onMouseEnter={handleMouseEnter} onMouseLeave={handleMouseLeave}>
Go to About
</button>
</Link>
{isPreloading && <div>Preloading...</div>}
</div>
);
}
// 应用入口
function App() {
return (
<BrowserRouter>
<Routes>
<Route path="/" element={<Home />} />
<Route
path="/about"
element={
<Suspense fallback={<div>Loading...</div>}>
<About />
</Suspense>
}
/>
</Routes>
</BrowserRouter>
);
}
exportdefault App;
我们可以看到在鼠标经过按钮时,已经发送了 JSX 文件的网络请求!
经过前是这样的
鼠标经过时
不过由于 preload
基于 import()
,它不支持直接通过 AbortController
取消加载!我觉得它这是其唯一的不足了!
当然,TanStack Router 这个库可以做到取消预加载请求,但是需要大规模改动代码,我就放弃了!
react-lazy-with-preload
是一个简单而高效的工具,通过鼠标悬停预加载和鼠标移出取消加载的功能,帮助开发者打造流畅的 React 应用!
今天的分享就这些了,感谢大家的阅读,如果文章中存在错误的地方欢迎指正!
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有