Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >如何做前端性能优化?

如何做前端性能优化?

作者头像
前端西瓜哥
发布于 2022-12-21 11:44:01
发布于 2022-12-21 11:44:01
97600
代码可运行
举报
运行总次数:0
代码可运行

大家好,我是前端西瓜哥,这次来看看如何做前端性能优化。

因为前端优化的方案非常多,本文不会太深入讲解,否则就篇幅太长了,主要还是让大家对大的脉络有一些认识。具体里面的小点以后我会另写文章讲解。

前端性能优化,主要分两个大方向:资源加载优化代码优化

资源加载优化

资源加载优化,大致又分为三种:

  1. 资源压缩
  2. 延迟加载
  3. 减少 HTTP 请求。在 HTTP/1 时代,请求效率不高,需要排队,会造成堵塞,减少 HTTP 请求还是非常有效的。但已广泛普及的 HTTP/2 后使用了多路复用,可以充分利用带宽,不用考虑这个。甚至说拆成更多的资源,有利于做更细粒度的缓存。

下面我们看看具体都有哪些方法。

使用 HTTP/2

HTTP/2 的主要改进就在于提高加载资源的速度。

它使用了头部压缩,通过特有的 HPACK 算法,让请求头做了极致的压缩。

此外使用了多路复用,让请求产生流的特性,可以同时发送多个请求,充分利用带宽;

懒加载

一些暂时不用到的资源先不急着加载,在用到的时候再加载,目的是减少请求。

懒加载有很多种,有图片懒加载,滚动到图片位置,才开始加载图片(知乎使用了这个,另外 Nextjs 框架的 Image 组件也支持懒加载)。

还有 JS 模块的懒加载,像 ES6 的动态 import,这个在 Webpack 有支持。

还有组件的懒加载:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{visible && <Model />}

开启 gzip

我们可以开启 Web Server 的 gzip 压缩,对资源进行内容压缩再传输。

此外还有压缩率更好的 br 可以选择。

前端性能优化:启用 gzip

图片使用 WebP

WebP 是 Google 推出的拥有极其优秀压缩比的图片格式。

我们可以判断客户端是否支持 WebP,如果支持则使用 WebP 来替代 jpg,减少图片大小。

空闲时加载之后可能需要访问的资源

加载当前页面资源的时候,调低某个暂时不用到的资源的下载优先级,在空闲的时候再加载,并将其缓存起来。

当用户从当前页面跳转到另一个页面,如果该页面用到了该资源,就可以直接使用缓存了。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<link rel="prefetch" href="lib/jquery.min.js" as="script">

关于资源加载管理的讲解,可以看我的这篇文章:

管理好资源的加载,你需要了解的 preload、prefetch、preconnect 以及 dns-prefetch

base64 内联

一些比较小的资源,比如一个不大的图标图片,可以考虑转换成 base64 格式,内嵌到 HTML 中。这样做的目的是减少 HTTP 请求数量。

下面是 webpack 的 url-loader 配置,将小于 8192 字节的图片转换为 base64。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
  test: /\.(png|jpg|gif)$/i,
  use: [
    {
      loader: 'url-loader',
      options: {
        limit: 8192,
      },
    },
  ],
},

雪碧图

英文原名为 CSS Sprites,指将多个小图片(比如图标)整合到一张大图片上,下载完后通过 CSS 的 background-position 属性框选需要用到的小图片上。

作用是减少 HTTP 请求数量,以及提前加载好一些图片资源,比如按钮图片的 hover 效果。

什么叫 “雪碧图”?

合理使用 HTTP 缓存

利用 HTTP 缓存策略,通过强缓存和协商缓存的配合,让一些资源能够不必再从服务端获取,而是直接复用本地缓存好的资源。

HTTP 缓存策略:强缓存和协商缓存

使用 SVG

多用矢量图,少用位图,减少图片大小。

普通位图图片要记录所有像素的色值,而 SVG 矢量图保存的其实是描述形状的文本信息,能减少很多体积。

CSS 放头 JS 放尾

CSS 放头,指的是放到 head 标签下的尾部,这样就能在 HTML 解析前,先加载 CSS 构造对应的 CSSOM,更早地和 DOM 进行合并渲染。

JS 放尾部,指的是放到 body 表情下的尾部。因为 JS 是会阻塞页面渲染并立即执行的,因为它可能会改变 DOM 结构。放到尾部,也就是整个 HTML 解析完之后,这样 JS 也能读取到完整的 DOM 树。

域名分片

域名分片是将需要的资源放到不同的域名下,提高 TCP 连接数。

因为 HTTP/1 的 TCP 连接下同时只能有一个 HTTP 请求,而网页打开时,往往至少有十几个的请求。为了让资源下载得更快些,浏览器会给一个域名建立 5~8 个 TCP 连接,通过并行的方式减少加载时间。

但有时候还是不够用,那我们就用多个域名呗,也就是域名分片,这样我们的 TCP 连接数就是 域名数 x 5,并发数量 UP!

使用缩略图

当我们通过列表的形式查看图片时,我们可以提供图片的缩略图,而不是提供大的原图。

用户点击预览的时候,才加载原图。

压缩文本类资源

这里的压缩指的是通过编译工具,将一些文本资源做内容的压缩。

比如 HTML、CSS、JS 中去掉多余的空格符,还有 JS 代码中一些名字很长的变量名缩减为一个字符、移除注释和没用到的变量等。

CDN

CDN,Content Delivery Network,内容分发网络

CDN 其实就是将一些静态资源分发到位于不同位置的多个服务器上。

当用户请求资源时,首先会进行域名查询,得到域名对应的 IP 地址,在这里 CDN 会使用根据用户所在地的 IP 地址,提供一个最近的服务器 IP。

这样用户就能更快更稳定地获取资源,同时也减轻了源服务器的压力。

代码优化

节流和防抖

防抖和节流是比较常见的优化手段,常见于降低高频事件响应函数的响应。

节流是将原来的高频率的执行,调整为稳定的低频执行。

防抖是将高频率触发的请求降低为只执行最后一个函数。

事件委托

将有类似行为的大量子元素的事件响应函数,通过事件冒泡的方式,委托提升到父元素上,这样一个函数就可以替代多个函数,减少了内存。

JS 中的事件委托是什么?

使用缓存

在编程中,我们会经常使用哈希表,来缓存一些常用的数据,减少一些不必要的计算量。

这在算法题中还挺常用的,比如回溯要用备忘录来缓存一些结果。

长列表优化

长列表指的是列表项很多的列表,达到成千上万的规模。

如果要一次性将它们渲染出来,在渲染阶段容易遇到瓶颈,导致页面卡顿。常见的解决方案有两种:

  1. 使用时间分片:不一次性加载所有列表项,间隔一段时间渲染一批,直至全部渲染完;
  2. 使用虚拟列表:只渲染可视区域内的列表项

长列表优化:用 React 实现虚拟列表

Web Worker

Web Worker 相当于又新开了一个进程。单线程的 JS 进程可以和这个进程通信,传递数据和接受数据。

一些非常耗费算力的事情可以考虑放到 Web Worker,然后主进程就不会被阻塞。但 Web Worker 启动比较耗时,通常来说 Web Worker 在 90% 的场景都不需要用到。

注意内存泄漏问题

内存泄漏,指的是一些不需要的内存因为处理不当没能成功回收,导致占用内存越来越多,导致网页卡顿甚至崩溃。

导致内存泄漏的主要原因有:

  1. console 打印了太多的大对象;
  2. 忘记在必要的时候移除监听器,比如在组件卸载的时候;
  3. 意外声明全局变量。全局变量不会被销毁,会在程序运行的生命周期一直存在;
  4. 集合类数据类型存了一些不再使用的大的数据;

网页卡了?有可能是内存泄漏了

减少回流和重绘

回流:当渲染树中的一些元素、属性、尺寸等发生变化时,浏览器重新渲染部分或全部文档。

重绘:一些不改变元素物理属性的变化,比如改变背景色、字体大小,就不需要重新计算元素的位置,只要改一下样式就好。

回流导致的改变比较大,比较消耗性能,所以需要注意你的操作不要导致不必要的回流。比如往 DOM 树中加入一些元素,不要一个个加,而是要一次性将这些元素加进去。

React 相关优化

比如使用 React.memo 跳过一些组件的不必要渲染,进行状态的批量更新等。

另外,不要过早优化。

如何做 React 性能优化?

改用服务端渲染/预渲染

将一些数据在服务端就获取并渲染到 HTML 中,可以提高首屏加载速度。

服务端可以提前渲染好页面,而不是等待客户端加载完框架,然后请求数据再渲染出来。

结尾

本文简单列举了一些前端做性能优化的点,希望对你有一点帮助。

我是前端西瓜哥,欢迎关注我,学习更多前端知识

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-09-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 前端西瓜哥 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
前端性能优化秘籍:让你的网页飞起来
作为一名前端开发者,遇到页面加载慢、卡顿、白屏这些问题再正常不过了。毕竟,用户的耐心就像天气一样多变——一旦页面超过 3 秒 还没加载完,他们可能就会毫不犹豫地关掉网页,去找别的替代品。
Echo_Wish
2025/03/16
890
前端性能优化秘籍:让你的网页飞起来
漫谈前端性能优化
https://www.cnblogs.com/zjstar12/archive/2012/01/12/2320408.html
一粒小麦
2019/08/22
8260
前端性能优化总结
标记为async的脚本并不保证按照指定它们的先后顺序执行。对它来说脚本的加载和执行是紧紧挨着的,所以不管你声明的顺序如何,只要它加载完了就会立刻执行。
ConardLi
2019/09/08
1.2K0
前端性能优化(二)
     从用户访问资源到资源完整的展现在用户面前的过程中,通过技术手段和优化策略,缩短每个步骤的处理时间从而提升整个资源的访问和呈现速度。
用户2305169
2018/08/23
4120
前端性能优化--加载流程篇
前面我有给大家整体地讲过《前端性能优化--归纳篇》,其实里面已经囊括了大多数场景下的一些性能优化的方向。
被删
2024/01/17
4911
前端性能优化--加载流程篇
7000字前端性能优化总结 | 干货建议收藏
为什么要做性能优化?性能优化到底有多重要? 网站的性能优化对于用户的留存率、转化率有很大的影响,所以对于前端开发来说性能优化能力也是重要的考察点。
coder_koala
2021/03/30
1.1K0
7000字前端性能优化总结  |  干货建议收藏
【综合篇】Web前端性能优化原理问题
想要成为一名合格的Web前端工程师,Web前端性能优化是一个必须要掌握的知识,那么应该怎么进行Web前端性能优化呢?--达达前端
达达前端
2020/02/18
1.8K0
【综合篇】Web前端性能优化原理问题
讲讲前端性能优化
“好事”文章:前端小白使用Docsify+Markdown+‌Vercel,无服务器部署个人知识库
用户7194327
2024/12/04
1180
前端性能优化的七种方法是_web前端性能
前端性能优化主要有七种方法,包括减少请求数量、减少资源大小、优化网络连接、优化资源加载、减少重绘回流、使用性能更好的API和webpack优化
全栈程序员站长
2022/11/15
2.5K0
前端性能优化
前端性能优化是提升用户体验、提高页面加载速度和响应速度的关键步骤。以下是一些核心优化策略和具体实现方法:
lpp182
2025/06/05
2050
我们为什么要做前端性能优化?
大家知道。我们每天都在谈前端性能优化,每天都在背前端性能优化方案,然而,我们却不知道他背后的原理以及涉及那些知识储备。所以,我问了自己一些问题,
用户7413032
2022/03/09
1.3K0
我们为什么要做前端性能优化?
前端性能优化
前端性能优化与重绘与回流有关系的原因是:频繁的触发重绘与回流,会导致UI频繁染,最终会导致js变慢,会导致页面性能变差
javascript艺术
2021/05/28
9480
前端性能优化
前端性能优化:理论支撑与实践之路
今天我想和大家聊聊“前端性能优化”这个话题。不论你是刚入门的新手,还是经验丰富的老手,性能优化始终是前端开发的一个绕不开的坎。它既关乎用户体验,又直接影响产品的竞争力,甚至还是开发者自我成就感的重要来源。
Echo_Wish
2025/04/24
1240
前端性能优化:理论支撑与实践之路
前端性能优化原理与实践
在资源请求的过程中,涉及到网络请求的,包括:HTTP、TCP、DNS。其中TCP、DNS前端能做的工作非常有限,因此「优化HTTP」就成为了首要任务。
chuckQu
2022/08/19
1.1K0
写在 2021 的前端性能优化指南
当收集浏览器端每个用户核心性能指标时,可通过 web-vitals 收集并通过 sendBeacon 上报到打点系统。
山月
2021/10/27
1.4K0
写在 2021 的前端性能优化指南
快速了解前端性能优化
在前端开发的过程中,很多时候除了日常的需求开发以外,我们还需要对我们的页面进行性能优化,那么这次就分享一下前端开发我能想到的一些优化方案进行总结。
LamHo
2022/09/26
9540
快速了解前端性能优化
前端性能优化:构建快速且流畅的Web体验
在现代Web开发中,性能优化是提升用户体验的关键因素之一。随着网络环境的变化和用户需求的增长,如何让Web应用在各种设备上快速加载并流畅运行变得尤为重要。本文将深入探讨前端性能优化的各种技术和策略,帮助开发者构建更快、更高效的Web应用。
井九
2024/10/12
3520
前端性能优化:构建快速且流畅的Web体验
谈谈前端性能优化-面试版
当我们去面试的时候,很大概率会被面试官问这么一个问题:你有尝试过对项目做性能优化吗?或者你了解哪些性能优化的方法?听到这个问题的你可能是这样的:
loveX001
2022/10/11
1.3K0
前端性能优化
从用户访问资源到资源完整展现在用户面前的过程中,通过技术手段和优化策略,缩短每个步骤的处理时间从而提升整个资源的访问和呈现速度。
红目香薰
2022/11/29
7002
前端性能优化小结
https://www.yuque.com/liugezhou/drrg7f/gav2aq
六个周
2022/10/28
4020
相关推荐
前端性能优化秘籍:让你的网页飞起来
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验