阿里云开发者 2024年10月01日
灵魂拷问-前端到底能做些什么?--性能优化篇
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

本文整理了前端性能优化的一些常见策略,从资源请求和页面渲染两个方面,分别介绍了优化思路、常见方案以及具体实现方法。文章重点阐述了如何提高资源请求并发数量、缩短单次请求时间、优化资源请求顺序,以及如何利用服务端渲染、JS代码优化、CSS代码优化、图片优化和动画优化等策略来提升页面渲染性能。

💥 **资源请求优化** 资源请求环节的优化旨在让页面渲染的资源尽可能快地 ready,从而加速页面渲染。文章列举了多种优化策略,包括增加请求并发数量、缩短单次请求时间以及优化资源请求顺序。 - **增加请求并发数量**:利用多个域名、升级 HTTP2/3 协议以及 CDN 等技术,突破浏览器对同一域名并发请求数量的限制,提高资源加载速度。 - **缩短单次请求时间**:通过减少构建产物体积、网络传输中进行压缩以及启用缓存等方法,降低目标资源体积,从而缩短单次请求时间。 - **优化资源请求顺序**:使用 DNS 预获取、域名预连接、预加载和预获取等技术,确保关键资源尽早加载,非关键资源延迟加载,提升页面渲染速度。

💥 **页面渲染优化** 页面渲染环节的优化则侧重于提高页面渲染效率,减少页面渲染时间。文章重点介绍了服务端渲染、JS 代码优化、CSS 代码优化、图片优化和动画优化等策略。 - **服务端渲染 (SSR)**:将页面在服务器端进行渲染,生成完整的 HTML 页面,然后发送给浏览器,可以显著提高首屏加载速度,但需要额外的服务器资源,且开发难度较大。 - **JS 代码优化**:减少 DOM 操作、批量进行 DOM 更改、优化事件监听、使用 Web Worker 等技术,降低 JS 代码执行带来的性能损耗。 - **CSS 代码优化**:减少 CSS 代码体积、使用 CSS 预处理器、优化 CSS 选择器、使用 CSS 动画库等方法,提升 CSS 代码的加载和渲染效率。 - **图片优化**:使用压缩工具、选择合适的图片格式、使用响应式图片等技巧,减小图片体积,提高图片加载速度。 - **动画优化**:使用 CSS 动画或 JavaScript 动画库、优化动画性能、使用 requestAnimationFrame 等技术,保证动画流畅且不影响页面性能。

💥 **其他优化策略** 除了上述资源请求和页面渲染环节的优化策略外,文章还提到了其他一些优化策略,例如: - **浏览器缓存**:利用 HTTP 缓存、Service Worker 缓存以及 Web 存储 API 等技术,缓存静态资源和关键接口数据,减少重复请求,提升页面性能。 - **性能测试**:使用 Lighthouse、PageSpeed Insights 等性能测试工具,对网站进行性能分析,找出性能瓶颈,并制定针对性的优化方案。 - **代码质量**:编写高质量的代码,遵循代码规范,使用代码优化工具,提高代码效率,降低性能损耗。 - **持续优化**:性能优化是一个持续改进的过程,需要不断分析网站性能数据,并针对性地进行优化,才能不断提高网站性能。 - **用户体验**:性能优化最终目的是提升用户体验,因此在进行性能优化时,要时刻关注用户体验,确保优化后的页面依然流畅、易用,并能满足用户的需求。

原创 硅步 2024-09-25 08:30 浙江

作者最近在尝试对负责的平台进行性能优化,本文整理了些前端性能优化的一些常见策略。

阿里妹导读


作者最近在尝试对负责的平台进行性能优化,本文整理了些前端性能优化的一些常见策略。

踏上取经路,比抵达灵山更重要。

一、概览

最近在尝试对负责的平台进行性能优化,整理了一下前端性能优化的一些常见策略。一般性能优化的常见思路是:先进行性能现状分析定义出问题,然后针对问题结合性能优化策略给出技术方案并进行评估,最后再落地&验证技术方案。工欲善其事,必先利其器,让我们跟随本文了解一下常见的性能优化策略。话不多说,先上大纲。

清晰大图见链接或点击文末阅读原文查看:

https://developer.aliyun.com/article/1610662

二、常见性能优化策略

2.0 前置储备知识点

2.0.1 用户访问页面CRP(用户输入一个URL后会发生什么)

前端面试有一个很经典的问题:用户输入一个URL后会发生什么。这个问题可以很有效的考察候选人知识的广度,甚至于深度。一般来说,web端的性能优化,本质上就是尽可能缩短“用户输入一个URL”到“用户可以在网页上进行预期行为”这两个时间点的时间间隔。

因此,web性能优化一般会被纳入用户体验优化的一环。在一些C端场景,用户可以进行预期行为的耗时,和最终相关页面产生的收益有着很明显的正向关联,网络上可以找到一些相关案例。

所以,在进行性能优化前,我们需要了解我们要优化的东西是什么。也就引出了用户访问页面CRP(关键渲染路径)。简单点说,用户输入URL后一般经历如下环节。

核心公式:“用户访问页面耗时” = “资源请求耗时” + “页面渲染耗时”。参考下方示意图:

2.0.2 浏览器的进程和线程机制

优化策略中有涉及web worker 等概念,web worker是基于后台线程去运行的,所以在下图简单介绍下浏览器的进程和线程机制。

2.0.3 页面重绘&重排(回流)

重绘是指当元素的外观(如颜色、背景、阴影等)发生变化时,浏览器需要重新绘制这些元素,但不需要重新计算它们的布局。重绘不会影响文档的结构,只是更新了元素的视觉表现。比如改变元素的背景颜色、修改文本的颜色或字体样式。

重排,又称回流,是指当元素的几何属性(如宽度、高度、位置等)发生变化时,浏览器需要重新计算元素的布局。这通常会导致整个文档的布局被重新计算,因此重排的开销比重绘要大得多。比如改变元素的大小(如宽度或高度)、添加或删除 DOM 元素、改变元素的边距、填充或边框。

重绘相对较轻量,通常不会显著影响性能。重排则可能导致性能问题,尤其是在频繁触发时,因为它会影响到整个文档的布局,可能导致多次重排和重绘。

2.1 资源请求环节

2.1.0 优化思路

首先我们定义出“资源请求耗时”的几个相关因素:请求并发数量、单次请求时间以及资源请求顺序。其中资源请求顺序并不能直接缩短“资源请求耗时”,但可以让“关键的资源”先完成请求,从而页面渲染先行启动。

2.1.1 增加请求并发数量

默认情况下,浏览器对同一域名下的并发请求数量有限制,通常为6-8 个。 这意味着浏览器在同一时间最多同时发送6-8 个请求给同一域名下的服务器。 超过这个数量的请求将会被排队等待。我们可以通过如下方案增加请求并发数量。

2.1.1.1 使用多个域名(又称域名分片、域名负载均衡)

域名分片(Domain Sharding)是一种优化技术,旨在提高网页加载速度和资源请求的并发性。其基本原理是将网站的静态资源(如图片、CSS、JavaScript文件等)分散到多个不同的域名或子域名上,以绕过浏览器对同一域名的并发请求限制。

2.1.1.2 升级http2

HTTP/2 是 HTTP 协议的第二个主要版本,旨在提高网络性能和效率。在 HTTP/1.x 中,每个请求通常需要建立一个新的 TCP 连接(HTTP/1.0),或者在同一连接上按顺序处理请求(HTTP/1.1,Keep-Alive),这导致了连接建立和关闭的开销。HTTP/2 允许多个请求和响应在同一连接上并发进行(多路复用特性),减少了连接的数量和延迟。下方介绍下HTTP2的多路复用以及其他特性。

2.1.1.3 升级http3

HTTP/3是超文本传输协议的第三个主要版本,它是基于QUIC(快速UDP互联网连接)协议构建的。QUIC最初是由Google设计的,旨在减少延迟并提高Web性能。HTTP/3解决了HTTP/2中存在的一些问题。

2.1.2 缩短单次请求时间

我们比较粗暴的定义一下“单次请求时间”的计算公式,“单次请求时间” = “目标资源体积” / “用户网速”。其中我们作为平台方很难去提升“用户网速”,所以就尽可能降低“目标资源体积”。对于前端来说,“目标资源体积”约等于“前端构建产物体积”。这里常规思路有三个:一是从减少构建产物体积;二是网络传输过程中进行压缩;三是启用缓存,直接不请求。

2.1.2.1 减少构建产物体积

这一步我们一般结合具体前端工程去做。我所参与开发的前端工程项目使用的是koi4(基于umi4) + webpack,所以是基于koi4和umi体系去介绍的。和其他体系相比,原理都一样,具体工程实现的方案上可能会有差异。

// edges/index.tsximport { Graph, Path } from '@antv/x6';import { GraphEdge, GRID_SIZE } from '../../constants';Graph.registerEdge(xxxx);Graph.registerConnector(xxx);
// index.tsximport './components/edges';

2.1.2.2 网络传输中压缩

一般用的都是gzip压缩。gzip压缩是一种广泛使用的数据压缩技术,主要用于减少文件大小以提高传输效率。服务端或者nginx配置一下开启就好。我们如果使用DEF打包项目扔到CDN上的话,g.alicdn.com也默认支持gzip压缩。

工程中的压缩主要是通过删除无用代码等减小文件体积,gzip压缩是在文件在网络传输过程中进行压缩。

2.1.2.3 缓存静态资源和关键接口

首先我们明确一下缓存对象:前端静态资源(如js/css/image等)以及对实时性要求不高但是在CRP中block后续渲染的接口(比如用户固定信息/菜单数据)等等。我们目前常涉及的缓存方案包括:CDN边缘节点缓存、HTTP缓存、service-worker缓存以及web存储API(localstorage/sessionstorage/indexdb)。我们一般不用Web存储API缓存静态资源,因为其空间有限。

2.1.3 优化资源请求顺序

2.1.3.1 关键资源尽早加载
<link rel="dns-prefetch" href="https://example.com">
<link rel="preconnect" href="https://fonts.gstatic.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="preload" href="/style.css" as="style"><link rel="preload" href="/script.js" as="script">
<link rel="prefetch" href="/next-page.html"><link rel="prefetch" href="/image.jpg" as="image">
2.1.3.2 非关键资源延迟加载&执行

2.2 页面渲染环节

2.2.0 优化思路

资源请求环节的优化是为了让页面渲染的资源尽可能快的ready,然后进行页面的渲染。在页面渲染环节,我们回顾一下页面渲染CRP。

首先,肯定离不开SSR这个老生常谈的优化方案。其次,我们当前重点关注CRP中几个常规web场景下的性能影响因素:JS代码、CSS代码、HTML代码、图片加载以及动画。可能不同业务场景下关注的重点不一样,其他的比如 WebGL、视频编码解码以及文档编辑器等等不再展开。

2.2.1 服务端渲染SSR

2.2.2 JS代码性能优化

2.2.2.1 DOM优化
2.2.2.2 函数任务优化
2.2.2.3 React专项

React18引入了useTransition和useDeferredValue两个钩子,用于管理渲染性能,特别是在并发模式下。

React19 计划引入“自动记忆化”,即:不用手动编写 useMemo useCallback memo 来进行性能优化,通过全新编译器,React 19 可以自动检测组件的状态变化,并智能地决定是否要重新渲染。

2.2.3 CSS代码性能优化

2.2.4 HTML代码性能优化

<img  srcset="480w.jpg 480w, 800w.jpg 800w"  sizes="(max-width: 600px) 480px, 800px"  src="800w.jpg"/>
<picture>  <source media="(max-width: 799px)" srcset="narrow-banner-480w.jpg" />  <source media="(min-width: 800px)" srcset="wide-banner-800w.jpg" />  <img src="large-banner-800w.jpg" alt="Dense forest scene" /></picture>
<video controls>  <source src="video/smaller.mp4" type="video/mp4" />  <source src="video/smaller.webm" type="video/webm" />  <source src="video/larger.mp4" type="video/mp4" media="(min-width: 800px)" />  <source    src="video/larger.webm"    type="video/webm"    media="(min-width: 800px)" />  <!-- fallback for browsers that don't support video element -->  <a href="video/larger.mp4">download video</a></video>

2.2.5 图片加载性能优化

2.2.6 动画性能优化

三、常见分析工具

可以通过网络自行研究用法。

3.1 chrome自带分析工具

3.1.1 performance面板


3.1.2 lighthouse面板

3.1.3 network面板

3.1.4 性能数据分析面板(即将被移除)

3.2 三方测评站点

用于分析测试网页性能。

3.2.1 pagespeed

3.2.2 webpagetest

3.3 webpack分析插件

3.4 VSCode 插件

四、总结

本文介绍了一些常见的性能优化策略以及用于调试优化效果的性能分析工具。我们在实际性能优化过程中,可以对自己要优化的目标项目进行分析,然后采用适合的策略去解决具体问题,最后用性能分析工具去验证优化效果。前端技术在持续发展,性能优化策略也会与时俱进。我们可以大胆尝试,小心求证。

路漫漫其修远兮,吾辈上下而求索.

参考链接:

[1]https://www.npmjs.com/package/umi-plugin-runtime-import

[2]https://www.npmjs.com/package/umi-plugin-runtime-import-v4

[3]https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Using_web_workers

[4]https://developer.mozilla.org/en-US/docs/Web/API/WebGPU_API

[5]https://zh-hans.react.dev/reference/react/useMemo

[6]https://zh-hans.react.dev/reference/react/useCallback

[7]https://ahooks.js.org/zh-CN/hooks/use-request/cache#swr

[8]https://github.com/alibaba/hooks/blob/master/packages/hooks/src/useRequest/src/utils/cache.ts

[9]https://github.com/umijs/qiankun/issues/1555

[10]https://www.yuque.com/kuitos/gky7yw/gs4okg

[11]https://css-tricks.com/css-sprites/

[12]https://developer.mozilla.org/zh-CN/docs/Web/CSS/background-position

阅读原文

跳转微信打开

Fish AI Reader

Fish AI Reader

AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

FishAI

FishAI

鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

联系邮箱 441953276@qq.com

相关标签

前端性能优化 资源请求 页面渲染 SSR JS优化 CSS优化 图片优化 动画优化 缓存 性能测试
相关文章