第 5 卷
◦ 部分第三方库(如ECharts、jQuery)在使用后需要手动销毁实例,否则会导致内存泄漏
1// ECharts实例创建 2const myChart = echarts.init(document.getElementById('chart'));
3 4// 组件卸载时销毁ECharts实例
5myChart.dispose();
- 避免循环引用
◦ 避免对象之间形成循环引用(如 a.b = b; b.a = a),虽然现代浏览器的垃圾回收机制
(标记清除法)已能处理循环引用,但在低版本浏览器或特殊场景下仍可能导致内存泄漏,尽量避免不必要的循环引用
12. 防抖和节流提高性能的场景
防抖(Debounce)和节流(Throttle)是两种用于「限制函数执行频率」的技术,核心作用是:避免函数因高频触发(如滚动、输入、点击)而频繁执行,减少不必要的计算和 DOM 操作,从而提升页面
性能和流畅度。
防抖(Debounce)
• 核心逻辑:触发事件后,延迟n秒再执行函数;若在n秒内再次触发事件,则重新计时,最终只执行
一次函数
• 提高性能的场景(需要「最后一次触发」执行的场景):
- 搜索框输入联想:用户在搜索框输入时,无需每输入一个字符就发送请求,而是等用户输入停
止后(如500ms内无输入),再发送联想请求,减少接口请求次数,减轻服务器压力
- 窗口大小调整(resize):用户调整浏览器窗口大小时,会高频触发 resize 事件,使用防
抖可在窗口调整完成后,只执行一次布局调整逻辑,减少回流次数
- 文本编辑器自动保存:等用户停止输入后,再执行自动保存操作,避免频繁保存导致的性能开
销
- 按钮防重复点击:避免用户快速点击按钮(如提交表单),导致多次触发接口请求,使用防抖
可保证只执行一次提交逻辑
节流(Throttle)
• 核心逻辑:触发事件后,每隔n秒只执行一次函数,无论事件触发多频繁,保证函数在固定时间间
隔内只执行一次
• 提高性能的场景(需要「间隔执行」的场景,保证执行频率稳定):
- 鼠标移动(mousemove):如拖拽元素、鼠标悬浮跟随效果,高频触发 mousemove 事件,
使用节流可稳定执行跟随逻辑,提升流畅度
- 高频点击按钮:如点赞按钮、刷新按钮,用户快速点击时,使用节流可限制点击频率(如1秒内
只能点击一次),避免频繁触发接口请求
- 视频播放进度条拖拽:拖拽进度条时,高频触发事件,使用节流可稳定更新播放时间,减少性
能开销
13. 常见图片优化操作及性能提升方案
图片是前端静态资源中体积占比最高的部分,图片优化的核心是「在保证视觉效果的前提下,最小化图片体积,减少加载时间」,常见优化操作如下:
- 选择合适的图片格式
◦ 静态图片:优先使用 WebP/Avif 格式(压缩率远高于 JPG/PNG,相同视觉效果下体积更小),
兼容低版本浏览器时可提供 JPG/PNG 降级方案
▪ WebP:支持有损压缩和无损压缩,静态图片体积比 JPG 小 25%-35%,比 PNG 小 50% 左
右
▪ Avif:压缩率比 WebP 更高,体积更小,但兼容性略差于 WebP
▪ JPG:适合色彩丰富的图片(如摄影图、宣传图),有损压缩,体积较小
▪ PNG:适合透明图片、图标、线条图(无损压缩,支持透明通道)
▪ SVG:适合矢量图(图标、logo、简单图形),无限放大不失真,体积小
◦ 动态图片:优先使用 WebM 格式(体积比 GIF 小 50% 以上),兼容低版本浏览器时使用 GIF
- 图片压缩(无损/有损压缩)
◦ 有损压缩:在可接受的视觉损耗范围内,降低图片质量,减小体积(如 JPG 质量设为
70%-80%,视觉效果无明显差异,体积大幅减小)
◦ 无损压缩:不损失图片质量,通过优化图片编码方式减小体积(如 PNG 图片压缩)
◦ 工具推荐:在线压缩(TinyPNG、CompressJPG)、构建时压缩(webpack 的 image-
webpack-loader)
- 使用合适的图片尺寸,避免大图小用
◦ 避免加载远大于显示尺寸的图片(如显示尺寸为 200x200px,却加载 1000x1000px 的图
片),造成不必要的带宽浪费和加载时间
◦ 使用响应式图片:根据设备屏幕尺寸和分辨率,加载不同尺寸的图片
| 4 | srcset="image_400w.jpg 400w, image_800w.jpg 800w" |
|---|---|
| 5 | sizes="(max-width: 768px) 400px, 800px" |
| 6 | alt="响应式图片" |
| 7 | > |
- 图片懒加载(核心优化)
◦ 对非首屏图片(如下方内容图片、列表图片)使用懒加载,只有当图片即将进入可视区域时才
加载,减少首屏加载时间
◦ 实现方式:原生 loading="lazy"(简单易用,现代浏览器支持)、Intersection
Observer API(兼容性更好,可自定义逻辑)
Code block
1<!-- 原生懒加载 --> 2<img src="image.jpg" alt="懒加载图片" loading="lazy">
- 使用雪碧图(CSS Sprite)
◦ 将多个小图标(如导航图标、按钮图标)合并为一张大图,通过 CSS background-
position 定位显示单个图标
◦ 优势:减少 HTTP 请求次数(多个图标只需加载一张图片),提升加载速度
- 图片预加载(针对性使用)
◦ 对后续即将用到的图片(如下一个轮播图、跳转后的首屏图片)使用预加载,提前缓存,提升
交互流畅度
- 使用 CDN 加速图片加载
◦ 将图片上传到 CDN 平台,利用 CDN 的边缘节点加速图片加载,减少网络延迟
- 避免图片内联(大图片)
◦ 小图标可使用 Base64 内联(减少 HTTP 请求),但大图片不建议内联(会增加 HTML 文件体
积,影响首屏加载)
14. 性能监控工具及页面性能监控方法
常用性能监控工具
• Chrome DevTools(最常用)
全站分卷索引 · 7 卷
- 1第 1 卷
- 前端性能优化全解析
- 1. 前端开发中性能优化的核心操作
- • 加载阶段优化:资源压缩(JS/CSS/图片)、代码分割、懒加载、CDN 接入、DNS 预解析、HTTP
- • 渲染阶段优化:避免重绘与回流、优化 CSS 选择器、使用 Flex/Grid 布局(性能优于传统布局)、
- • 运行阶段优化:JS 代码性能优化、避免内存泄漏、使用虚拟 DOM、防抖节流、优化事件绑定(事
- 2. 代码分割(Code Splitting) 及性能优化实践
- 什么是代码分割
- 开发中如何利用代码分割优化性能
- ◦ Vue:结合 vue-router 的 import() 动态导入实现路由懒加载
- ◦ React:结合 react-router 与 import() 实现
- ◦ Webpack 配置示例:通过 splitChunks 拆分第三方依赖
- 3. 懒加载(Lazy Loading) 与预加载(Preloading)
- 2第 2 卷
- 开发中的 CDN 使用实践
- 6. 浏览器缓存 & HTTP 缓存策略
- 1. 强缓存
- • 核心:浏览器直接从本地缓存读取资源,无需和服务器建立连接,响应状态码为 200 OK
- • 控制字段(HTTP 1.0/1.1):
- ◦ Expires:HTTP 1.0 字段,是一个绝对时间戳(如 Wed, 31 Dec 2025 23:59:59
- ◦ Cache-Control:HTTP 1.1 字段,优先级高于 Expires,支持相对时间配置(如
- ▪ public:所有节点(浏览器、CDN 等)均可缓存
- ▪ private:仅浏览器可缓存(默认值)
- ▪ no-cache:不使用强缓存,直接进入协商缓存
- ▪ no-store:不缓存任何资源
- ▪ max-age:缓存有效时间(秒)
- 3第 3 卷
- ◦ 避免频繁修改 width、 height、 margin、 top 等布局属性
- ◦ 实现元素移动、缩放、透明度变化时,使用 transform 和 opacity,这两个属性由 GPU
- 8. Vue、React 中的虚拟DOM如何增强性能
- 核心前提:真实DOM操作的性能瓶颈
- 虚拟DOM增强性能的核心原理
- ◦ Diff 算法优化策略:同层对比(不跨层级对比,降低复杂度)、key 标识(精准复用节点,避免
- 补充:框架层面的优化
- • Vue:通过响应式系统精准监听状态变化,结合虚拟 DOM 的 Diff 算法,实现按需更新;Vue 3 还引
- • React:通过 Fiber 架构实现可中断的 Diff 过程,优先处理高优先级任务,避免长时间阻塞主线
- 9. CSS选择器会影响浏览器的渲染性能吗
- 低效CSS选择器(应避免)
- 优化CSS选择器的实践
- 4第 4 卷
- 10. JavaScript代码性能优化操作
- ◦ 使用 Web Worker:将耗时计算(如大数据处理、复杂算法)放到 Web Worker 中执行,Web
- ◦ 拆分长任务:将超过 50ms 的长任务拆分为多个小任务,通过 requestIdleCallback 或
- ◦ 数据查询优化:使用 Map/Set 替代 Array 进行高频查询(Map 的查找时间复杂度为 O(1),
- ◦ 避免不必要的循环嵌套:循环嵌套的时间复杂度通常为 O(n²) 甚至更高,尽量优化为单层循环
- ◦ 缓存计算结果:对重复计算的结果进行缓存(如斐波那契数列的递归优化、组件渲染中的计算
- ◦ 减少直接 DOM 操作,优先使用虚拟 DOM 或框架提供的 API
- ◦ 使用事件委托(事件冒泡机制),减少事件绑定数量
- ◦ 避免频繁创建匿名函数:匿名函数无法被缓存,频繁创建会增加内存开销(如在 render 方
- ◦ 函数柯里化/防抖节流:减少不必要的函数执行(后文详细说明)
- ◦ 避免递归深度过深:递归深度过深会导致调用栈溢出,可改为迭代实现
- ◦ 使用 defer / async 加载非关键 JS 脚本:
- 5第 5 卷
- ◦ 部分第三方库(如ECharts、jQuery)在使用后需要手动销毁实例,否则会导致内存泄漏
- ◦ 避免对象之间形成循环引用(如 a.b = b; b.a = a),虽然现代浏览器的垃圾回收机制
- 12. 防抖和节流提高性能的场景
- 防抖(Debounce)
- • 核心逻辑:触发事件后,延迟n秒再执行函数;若在n秒内再次触发事件,则重新计时,最终只执行
- • 提高性能的场景(需要「最后一次触发」执行的场景):
- 节流(Throttle)
- • 核心逻辑:触发事件后,每隔n秒只执行一次函数,无论事件触发多频繁,保证函数在固定时间间
- • 提高性能的场景(需要「间隔执行」的场景,保证执行频率稳定):
- 13. 常见图片优化操作及性能提升方案
- ◦ 静态图片:优先使用 WebP/Avif 格式(压缩率远高于 JPG/PNG,相同视觉效果下体积更小),
- ▪ WebP:支持有损压缩和无损压缩,静态图片体积比 JPG 小 25%-35%,比 PNG 小 50% 左
- 6第 6 卷
- ◦ Performance 面板:录制页面加载和运行过程,分析帧率、主线程阻塞、回流重绘、JS 执行时
- ◦ Network 面板:监控所有资源的加载时间、大小、请求状态,分析资源加载瓶颈(如大文件加
- ◦ Layers 面板:查看页面的合成层,分析 GPU 加速情况
- ◦ Console 面板:通过 console.time() / console.timeEnd() 手动测试代码执行时间
- ◦ Performance Insights 面板:更简洁的性能分析面板,适合快速定位首屏加载、交互卡顿问题
- • Chrome Lighthouse
- ◦ 内置在 Chrome DevTools 中(Audits 面板),可生成全面的性能报告,包含核心 Web 指标
- ◦ 支持手动运行,也可集成到 CI/CD 流程中,实现自动化性能监控
- • Web Vitals:Google 推出的前端性能监控库,专门用于监控核心 Web 指标(LCP、FID、CLS、
- • Sentry:不仅支持错误监控,还支持性能监控,可跟踪页面加载、API 请求、函数执行的耗时,定
- • New Relic:企业级应用性能监控工具,支持前端、后端全链路性能监控
- • Fiddler:网络抓包工具,监控 HTTP/HTTPS 请求,分析资源加载和接口性能问题
- 7第 7 卷
- ◦ 注意: href 属性只需填写域名(无需带具体路径),如 https://cdn.xxx.com 而非
- ◦ 优先级:可配合 preconnect 使用( preconnect 不仅预解析 DNS,还会建立 TCP 连
- ◦ X-DNS-Prefetch-Control: on:开启 DNS 预解析(默认值)
- ◦ X-DNS-Prefetch-Control: off:关闭 DNS 预解析(不推荐,除非有特殊需求)
- ◦ 示例(Nginx 配置):
- ◦ HTML 标签: <meta http-equiv="X-DNS-Prefetch-Control" content="off">
- ◦ HTTP 响应头: X-DNS-Prefetch-Control: off
- DNS 预解析的应用场景
- 注意事项
- 总结