当前位置: 首页 > news >正文

HOW - prefetch 二级页面实践

文章目录

  • 方法一:使用 import()
  • 方法二:使用 link rel="prefetch" 或 link rel="preload"
  • 方法三:借助 Vite 插件自动预取
  • 小结
  • 批量预加载

在 Vite + React 项目中,如果你希望在访问首页(index 页面)时提前预加载(prefetch)二级页面的资源,从而在用户点击进入时加快加载速度,有几种常见、有效的方式。


方法一:使用 import()

如果你的二级页面是通过 动态 import(代码分割) 实现的(这是 Vite 推荐的懒加载方式),那么你可以手动对它的资源进行预取(prefetch)。

比如你的路由是这样定义的

// router.tsx
import { lazy } from "react";const IndexPage = lazy(() => import("./pages/Index"));
const AboutPage = lazy(() => import("./pages/About")); // 二级页面export const routes = [{ path: "/", element: <IndexPage /> },{ path: "/about", element: <AboutPage /> },
];

你可以在 IndexPageuseEffect 中触发 import(),这样浏览器就会预加载资源(但不会执行)

// pages/Index.tsx
import { useEffect } from "react";export default function Index() {useEffect(() => {// 预取 About 页面的资源import("./About");}, []);return (<div><h1>首页</h1><a href="/about">去 About</a></div>);
}

这里 ./About 并不是指构建后的实际路径,而是与Index同一层级下的About.tsx。Vite 在打包时会自动把这个 import("./About") 替换成对 about-yyyy.js 的懒加载请求。你不需要知道它的真实文件名。

优点:

  • 简单好用,不需要额外依赖。
  • Vite 在 build 后会自动生成 chunk,对应资源会被预取。
  • 实际浏览器加载时,用户点击 /about 基本是即时打开。

注意:

  • 这种方式属于「预加载模块」,不是真正意义的浏览器 rel="prefetch" 标签。
  • 适合用在用户很大概率会访问的二级页面上。

方法二:使用 link rel=“prefetch” 或 link rel=“preload”

如果你希望更明确地让浏览器在空闲时预取资源,可以在首页渲染时插入一个 <link> 标签

import { useEffect } from "react";export default function Index() {useEffect(() => {const link = document.createElement("link");link.rel = "prefetch";link.href = "/assets/AboutPage.xxx.js"; // 构建后的 chunk 路径document.head.appendChild(link);}, []);return <h1>首页</h1>;
}

这种方式比较麻烦的是:

  • 你要知道 About 页面的构建产物路径(可以通过 manifest.json 或动态 import 的返回值获取)。
  • 更适合对静态资源(图片、视频、大文件)做预加载

方法三:借助 Vite 插件自动预取

还有一种自动化的方式是使用社区插件,例如 👉
vite-plugin-pwa(适合离线场景)
vite-plugin-prefetch(更灵活的 prefetch)

vite.config.ts 中配置:

import prefetch from "vite-plugin-prefetch";export default {plugins: [prefetch({rel: "prefetch",include: ["about"], // 你想要预取的 chunk 名称}),],
};

优点

  • 自动插入 <link rel="prefetch">
  • 不需要在组件中写逻辑。

小结

方式特点适合场景
import() 预加载简单、推荐二级页面懒加载
<link rel="prefetch">控制更细,但需路径预取静态资源
React Router 预加载更规范使用 react-router v6+
Vite 插件自动化零侵入大型项目,多个页面

批量预加载

如果你有多个页面,也可以并行预加载:

useEffect(() => {Promise.all([import("./About"),import("./Contact"),import("./Help"),]);
}, []);

当然也可以封装一个工具函数:

// utils/prefetchRoutes.ts
export async function prefetchRoutes(paths: string[]) {const prefetchMap: Record<string, () => Promise<any>> = {"/about": () => import("../pages/About"),"/contact": () => import("../pages/Contact"),"/help": () => import("../pages/Help"),};await Promise.all(paths.map((path) => prefetchMap[path]?.()));
}// Index.tsx
import { useEffect } from "react";
import { prefetchRoutes } from "../utils/prefetchRoutes";export default function Index() {useEffect(() => {prefetchRoutes(["/about", "/contact", "/help"]);}, []);return (<div><h1>首页</h1><a href="/about">About</a><a href="/contact">Contact</a><a href="/help">Help</a></div>);
}

注意,如果二级页面特别多,比如十几个甚至几十个,一次性全部预加载反而会拖慢首页加载。

推荐策略:

  1. 对访问概率高的页面在首页预加载(比如「关于我」)。
  2. 对不常访问的页面延迟到用户第一次 hover / focus 时再预加载。
<ahref="/about"onMouseEnter={() => import("./About")}
>About
</a>

这样用户第一次将鼠标移到链接上时,就已经预取完成,点击时是“秒开”。

最推荐的实践组合是:

  1. 在首页 useEffect 中预加载 1~3 个高频页面。
  2. 对其余页面用 hover 延迟预加载。
  3. 保持首页首屏加载轻量。
http://www.dtcms.com/a/486903.html

相关文章:

  • OCR:开启档案管理的智能新时代
  • 设计网站官网入口广州做一个网站多少钱
  • 比较好的平面设计网站群晖nas安装wordpress安装
  • 重生之我在大学自学鸿蒙开发第六天-《组件导航》
  • Fragment如何实现Activity栈的压栈和出栈
  • 【组合数学题目】宇宙分解
  • 产品网站开发流程图多店铺开源商城系统
  • 百度收录好的网站免费h5网站制作平台
  • 包头微网站开发wordpress打赏作者插件
  • Rust数据库与工具的选择
  • 淮滨网站制作字体排版网站
  • Spring Boot 3.0 的架构革新:为何弃用 spring.factories 并转向 imports 文件
  • 网站访问密码python报班一般多少钱
  • 渗透测试所需域名和IP信息收集方法
  • TensorFlow2 Python深度学习 - 卷积神经网络示例-使用MNIST识别数字示例
  • LKT4305GM多功能安全芯片
  • 大连网站建设蛇皮果服装设计公司排行
  • 淄博网站建设公司乐达站长工具综合查询官网
  • 7. 从0到上线:.NET 8 + ML.NET LTR 智能类目匹配实战--反馈存储与数据治理:MongoDB 设计与运维
  • C语言基础知识回顾
  • 未来之窗昭和仙君(二十)订单通知提醒——东方仙盟筑基期
  • 网址链接在桌面上创建快捷方式步骤
  • UVa 10766 Organising the Organisation
  • FastDFS 可观测性最佳实践
  • 网站推广在哪些平台做外链广州建工集团有限公司官网
  • Linux中字符串拷贝函数strlcpy的实现
  • PostgreSQL 18 发布
  • DrissionPage下载文件
  • 观澜做网站公司百度seo网站在线诊断
  • 电子商务网站建设题目男女直接做网站