性能工程练习册
一、选择题
1. 以下哪个指标衡量页面最大可见内容的渲染时间?
A. FCP B. LCP C. CLS D. TTFB
查看答案与解析
答案:B
解析:LCP(Largest Contentful Paint)衡量视口中最大可见元素渲染完成的时间。
2. Core Web Vitals 包括以下哪三个指标?
A. FCP、FID、TTFB B. LCP、INP、CLS C. FP、FCP、LCP D. TBT、TTFB、FID
查看答案与解析
答案:B
解析:Google Core Web Vitals 当前为 LCP、INP、CLS。INP 已取代 FID。
3. 以下哪种操作会触发重排(Reflow)?
A. 修改 color B. 修改 transform C. 修改 width D. 修改 opacity
查看答案与解析
答案:C
解析:修改 width、height、margin 等几何属性会触发重排。color 触发重绘,transform 和 opacity 主要触发合成。
4. 以下哪个缓存头表示资源在 1 小时内可以直接使用本地缓存?
A. Cache-Control: no-cache B. Cache-Control: no-store C. Cache-Control: max-age=3600 D. Cache-Control: must-revalidate
查看答案与解析
答案:C
解析:max-age=3600 表示资源在 3600 秒内有效,可直接使用缓存。
5. 防抖(debounce)最适合以下哪个场景?
A. 窗口 resize 事件处理 B. 滚动事件处理 C. 搜索框实时输入 D. 按钮点击
查看答案与解析
答案:C
解析:防抖适合事件停止触发后才执行的场景,如搜索框输入后触发搜索。resize 和滚动更适合节流。
二、填空题
6. FCP 的全称是 ______,表示浏览器首次渲染出有意义内容的时间。
查看答案与解析
答案:First Contentful Paint
解析:FCP 是 First Contentful Paint 的缩写。
7. 浏览器渲染流程中,修改元素的几何属性会触发 ______,代价较高。
查看答案与解析
答案:重排 / Reflow / Layout
解析:几何属性变化会导致浏览器重新计算布局,即重排。
8. Service Worker 的 ______ 策略表示优先使用缓存,缓存没有时再去请求网络。
查看答案与解析
答案:Cache First
解析:Cache First 策略优先命中缓存,适合不经常变化的静态资源。
9. 使用 CSS 的 ______ 属性可以提示浏览器哪些元素即将变化,从而提前优化渲染。
查看答案与解析
答案:will-change
解析:will-change 告知浏览器元素将发生变化,浏览器可以提前做优化。但要谨慎使用。
10. 图片懒加载可以使用 HTML 原生的 ______ 属性。
查看答案与解析
答案:loading="lazy"
解析:现代浏览器支持 <img loading="lazy"> 原生懒加载。
三、代码分析题
11. 分析以下代码的性能问题,并给出优化方案。
function handleScroll() {
const boxes = document.querySelectorAll('.box');
boxes.forEach(box => {
box.style.width = box.offsetWidth + 1 + 'px';
box.style.height = box.offsetHeight + 1 + 'px';
});
}
window.addEventListener('scroll', handleScroll);查看答案与解析
答案与解析:
问题:
- 滚动事件高频触发,导致大量计算和 DOM 操作。
- 读写交错:读取 offsetWidth/offsetHeight 会强制重排,随后修改 style 再次触发重排。
- 未节流:滚动事件每秒触发几十次。
- 事件监听未清理:可能导致内存泄漏。
优化:
function handleScroll() {
const boxes = document.querySelectorAll('.box');
requestAnimationFrame(() => {
boxes.forEach(box => {
const width = box.offsetWidth;
const height = box.offsetHeight;
box.style.cssText = `width: ${width + 1}px; height: ${height + 1}px;`;
});
});
}
window.addEventListener('scroll', throttle(handleScroll, 16));进一步建议:如果动画效果允许,使用 transform: scale() 替代修改 width/height。
12. 以下是一个图片加载方案,指出可以优化的地方。
<img src="large-photo.jpg" width="800" height="600" alt="photo">查看答案与解析
答案与解析:
问题:
- 没有使用现代图片格式(WebP/AVIF)。
- 没有响应式图片,所有设备都加载 800px 大图。
- 没有懒加载,首屏就加载。
- 没有压缩,文件体积可能很大。
- 没有指定 decoding="async" 或 fetchpriority。
优化:
<picture>
<source srcset="photo.avif" type="image/avif">
<source srcset="photo.webp" type="image/webp">
<img
src="photo.jpg"
srcset="photo-400.jpg 400w, photo-800.jpg 800w"
sizes="(max-width: 600px) 400px, 800px"
loading="lazy"
decoding="async"
width="800"
height="600"
alt="photo"
>
</picture>13. 分析以下缓存配置,说明其对性能的影响。
location /static/ {
add_header Cache-Control "public, max-age=31536000, immutable";
}查看答案与解析
答案与解析:
- public:允许 CDN 等中间节点缓存。
- max-age=31536000:缓存一年,浏览器几乎不会再发起请求。
- immutable:告知浏览器文件内容不会改变,即使刷新也不重新验证。
影响:
- 静态资源加载极快,充分利用缓存。
- 风险:如果文件内容更新但文件名未变,用户可能长期不更新。
- 最佳实践:配合文件名哈希(如 app.abc123.js)使用,更新时文件名变化。
四、架构设计题
14. 设计一个电商首页的性能优化方案,列出关键优化点和指标目标。
查看答案与解析
参考答案:
关键优化点:
首屏资源优化
- 关键 CSS 内联,非关键 CSS 异步加载。
- 首屏 JS 代码分割,按需加载。
- 首屏图片使用 WebP/AVIF,响应式尺寸,懒加载非首屏图片。
网络优化
- 静态资源上 CDN。
- 开启 HTTP/2 或 HTTP/3。
- 开启 Brotli/Gzip 压缩。
- 使用 preconnect/prefetch/preload。
渲染优化
- 骨架屏提升 perceived performance。
- 避免布局偏移,图片指定 width/height。
- 长列表使用虚拟列表。
缓存策略
- 静态资源长期缓存 + 文件名哈希。
- API 数据合理缓存。
- Service Worker 缓存核心资源。
监控
- RUM 监控 LCP、INP、CLS。
- 建立性能预算和告警。
指标目标:
- LCP ≤ 2.5s
- INP ≤ 200ms
- CLS ≤ 0.1
- 首屏 JS ≤ 200KB(gzip 后)
15. 你如何建立团队的前端性能监控体系?
查看答案与解析
参考答案:
- 采集指标:使用 Web Vitals 库采集 LCP、INP、CLS、FCP、TTFB。
- 上报数据:通过日志服务或 RUM 平台(如 Sentry、Datadog、阿里云 ARMS)上报。
- 建立看板:按页面、设备、网络、地域维度展示性能数据。
- 设置阈值:定义 P50/P75/P95 分位数的告警线。
- 性能预算:在 CI 中限制 bundle 大小、请求数。
- 问题定位:结合 Source Map 和 Trace 定位慢请求、长任务、布局偏移。
- 持续优化:定期复盘,把性能指标纳入迭代目标。
16. 一个后台管理系统页面有大量表格数据,用户反馈卡顿。请给出优化方案。
查看答案与解析
参考答案:
- 虚拟列表:只渲染视口内行,如 react-window 或 vue-virtual-scroller。
- 分页或无限滚动:避免一次性加载全部数据。
- 列懒渲染:复杂列按需渲染。
- 减少重渲染:使用 memo/useMemo/useCallback 避免不必要渲染。
- 大数据量处理:排序/过滤放后端或使用 Web Worker。
- 表格骨架屏:加载时减少白屏焦虑。
- 监控长任务:用 Performance Observer 定位阻塞主线程的操作。
17. 对比 HTTP 缓存的强缓存和协商缓存。
查看答案与解析
参考答案:
| 类型 | 触发条件 | 状态码 | 请求次数 |
|---|---|---|---|
| 强缓存 | Cache-Control/Expires 未过期 | 200 (from cache) | 0 |
| 协商缓存 | 强缓存过期,带 ETag/Last-Modified 验证 | 304 Not Modified / 200 | 1 |
强缓存性能更好,但更新控制粒度粗;协商缓存能确保资源最新,但仍有请求开销。通常配合文件名哈希实现长期强缓存。
领域编号:A03 性能工程
最后更新:2026-06-18