面试题答案
一键面试可能遇到的性能问题
- 首次加载白屏时间长:虽然路由懒加载将代码分割成小块,但初始渲染时仍可能需要加载一定量的基础代码以及首屏路由对应的代码,若这部分代码量较大,会导致首次加载出现白屏等待时间。
- 路由切换卡顿:当切换到一个之前未加载过的路由时,需要先从服务器请求对应的代码块,若网络状况不佳,可能会出现明显的卡顿。
- 过多的代码块请求:如果代码分割过细,会导致在路由切换时产生过多的HTTP请求,增加网络开销,降低整体性能。
- 代码块缓存问题:如果没有合理设置缓存策略,相同的代码块在每次路由切换时都可能重新请求,浪费网络资源和时间。
优化策略
- 优化初始加载代码
- 分析打包结果:使用工具如
webpack-bundle-analyzer
分析打包后的文件,找出可以进一步优化的模块,如剔除未使用的代码,合并小的模块等。 - 预加载关键路由代码:对于首屏一定会用到的路由组件,可以在应用启动时使用
React.lazy
的同时配合Suspense
组件进行预加载,减少首次渲染的白屏时间。例如:
- 分析打包结果:使用工具如
import React, { lazy, Suspense } from'react';
const Home = lazy(() => import('./Home'));
function App() {
return (
<Suspense fallback={<div>Loading...</div>}>
<Home />
</Suspense>
);
}
- 优化路由切换性能
- 使用代码拆分粒度适中:避免代码分割过细,根据业务模块合理划分代码块,减少不必要的HTTP请求。同时也不能过粗,防止单个代码块过大。
- 网络预加载:利用浏览器的
prefetch
特性,在当前页面加载时提前请求可能需要的路由代码块。例如在index.html
中添加:
<link rel="prefetch" href="/about.bundle.js" />
- **服务端渲染(SSR)或静态站点生成(SSG)**:结合SSR或SSG技术,在服务器端将首屏所需的HTML内容生成好返回给客户端,减少客户端首次渲染的工作量,提升用户体验。
3. 缓存优化
- 设置合理的缓存头:在服务器端配置合适的缓存头(如 Cache - Control
等),确保代码块在浏览器端得到有效的缓存,避免重复请求。
- 客户端缓存管理:可以在客户端实现简单的缓存机制,例如使用 localStorage
或 IndexedDB
存储已经加载过的代码块,在路由切换时先检查本地缓存,若存在则直接使用。