前端性能优化
Published on Jun 23, 2023, with 63 view(s) and 0 comment(s)
Ai 摘要:本文探讨了前端性能优化的核心原理与实践方法。通过分析关键性能指标,介绍了减少HTTP请求、压缩资源文件、使用CDN加速、优化图片加载、合理缓存策略等技术手段。同时强调了代码分割、懒加载、减少重排重绘等编程优化技巧,并指出性能监控工具在持续优化中的重要性。文章旨在帮助开发者构建高效、流畅的用户体验。

性能优化

市场上的某个功能还没有能满足其需求的可选方案时,如果出来一个应用即使很难用,用户都要忍着用。如果这个功能确实能解决用户的某些痛点需求,且有其存在的价值,那么让用户忍受糟糕体验的背后,就存在对产品优化和改进的空间。

前端性能优化直接影响用户体验和商业价值。研究表明,加载速度每快100ms,电商转化率提升1.5%;超过3秒,超半数用户流失。流畅的交互和快速响应能提升用户留存,创造更大商业价值,是产品核心竞争力的关键。

网站性能测量

在之此前我们有必要对网站进行性能测量,以知道优化的方向在何处。

Chrome浏览器的Performance功能:通过Chrome浏览器访问我们要进行性能测量的网站,打开开发者工具的Performance选项卡。单击左上角的“开始评估”按钮后刷新网站,该工具便开始分析页面资源加载、渲染、请求响应等各环节耗费的时间线,据此便可分析一定程度的性能问题,比如JavaScript的执行是否会触发大量视觉变化的计算,重绘和重排(或回流)是否会被多次触发等。

灯塔(Lighthouse):Lighthouse是一个开源的自动化审查网站页面性能的工具,可根据所提供的网站URL从性能、可访问性、渐进式Web应用、SEO(搜索引擎优化)等多个方面进行自动化分析,最终给出一份具有指导意义的报告。

Description

Description

除此之外,还会经常用到的性能测试工具有PageSpeed Insights、WEBPAGETEST、Pingdom等。

网站页面的生命周期

在浏览器的地址栏中输入了一个URL后到整个页面渲染出来的过程。流程如下:

Description

在哪些地方可以进行优化呢?

  1. 传输资源的优化,比如图像资源,不同格式的类型的图片有不同的使用场景。

  2. 加载过程优化,不需要在首屏展示的信息会占用页面加载的时间。

  3. JavaScript代码书写是否合理,有无考虑内存泄漏。

  4. 关键渲染路径优化,是否存在不必要的重绘和回流。

  5. 本地存储和浏览器存储。

图像优化

网站作为一种信息传递的媒介,且如今各类Web项目中,图像资源的使用占比也越来越大,更应当注重图像资源的使用方式。如果网站中的图像资源未进行恰当的优化,那么势必会导致许多问题,诸如巨量的访问请求引发传输带宽的挑战,请求大尺寸图片需要过久的等待时间等。

图像优化问题主要可以分为两方面:图像的选取和使用图像的加载和显示

图像的选取与使用

当确定了图像的展示效果必须存在时,在前端实现上也并非一定就要用图像文件,还存在一些场景可以使用更高效的方式来实现所需的效果。如:

  • 网站中一个图像在不同的页面或不同的交互状态下,需要呈现出不同的效果(边角的裁切、阴影或渐变),其实没有必要为不同场景准备不同效果的多份图像文件,只需用CSS将一张图像处理为所需的不同效果即可。相对于一个图像文件的大小来讲,修改其所增加的CSS代码量可以忽略不计。

  • 如果一个图像上面需要显示文字,建议使用网页字体的形式通过前端代码进行添加,而不是使用带文字的图像,其原因一方面是包含了更多信息的图像文件一般会更大,另一方面是图像中的文本信息带来的用户体验一般较差(不可选择、搜索及缩放),并且在高分辨率设备上的显示效果也会打折扣。

压缩是降低源文件大小的有效方式,对JavaScript代码或网页的一些脚本文件而言,压缩掉的内容是一些多余的空格及不影响执行的注释,其目的是在不损坏正常执行的情况下,尽量缩小源文件的大小。对图像文件而言,由于人眼对不同颜色的敏感度存在差异,所以便可通过减少对某种颜色的编码位数来减小文件大小,甚至还可以损失部分源文件信息,以达到近似的效果,使得压缩后的文件尺寸更小。对于图像压缩,应该采用有损压缩还是无损压缩当根据具体的业务场景进行合理的选择。

不同的图像文件格式(JPG、PNG、GIF等)之间的区别,在于它们进行有损压缩和无损压缩过程中采用了不同的算法组合。

具体图片类型该如何选择,每种类型有何优缺点:Web开发中图片的选择

CSS Sprite技术就是我们常说的雪碧图,通过将多张小图标拼接成一张大图,有效地减少HTTP请求数量以达到加速显示内容的技术。通常对于雪碧图的使用场景应当满足以下条件:首先这些图标不会随用户信息的变化而变化,它们属于网站通用的静态图标;同时单张图标体积要尽量小,这样经过拼接后其性能的提升才会比较乐观;若加载量比较大则效果会更好。

图像的加载和显示

首先来想象一个场景,当浏览一个内容丰富的网站时,比如电商的商品列表页、主流视频网站的节目列表等,由于屏幕尺寸的限制,每次只能查看到视窗中的那部分内容,而要浏览完页面所包含的全部信息,就需要滚动页面,让屏幕视窗依次展示出整个页面的所有局部内容。显而易见,对于首屏之外的内容,特别是图片和视频,一方面由于资源文件很大,若是全部加载完,既费时又费力,还容易阻塞渲染引起卡顿;另一方面,就算加载完成,用户也不一定会滚动屏幕浏览到全部页面内容,如果首屏内容没能吸引住用户,那么很可能整个页面就将遭到关闭。

既然如此,本着节约不浪费的原则,在首次打开网站时,应尽量只加载首屏内容所包含的资源,而首屏之外涉及的图片或视频,可以等到用户滚动视窗浏览时再去加载。以上就是延迟加载优化也叫懒加载策略的产生,通过延迟加载“非关键”的图片及视频资源,使得页面内容更快地呈现在用户面前。这里的“非关键”资源指的就是首屏之外的图片或视频资源。

具体懒加载相关:原生js实现图片懒加载

上文中在处理判断图片是否进入可视区域时使用到了 window.innerHeight 与 top 对比实现,除此之外现代浏览器已大多支持了Intersection Observer API,可以通过它来检查目标元素的可见性,这种方式的性能和效率都比较好。除了上述的实现懒加载方式还可以通过动态改变css类名、img的lazy属性等方式。

与延迟加载图像资源类似,通过〈video〉引入的视频资源也可进行延迟加载,但通常都会根据需求场景进行具体的处理。由于Chrome等一些浏览器会对视频资源进行预加载,即在HTML完成加载和解析时触发DOMContentLoaded事件开始请求视频资源,为了使页面更快地加载并渲染出来,可以阻止不需要自动播放的视频的预加载。

除此之外应当尽量用视频代替尺寸过大的GIF动画。虽然GIF动画的应用历史和范围都很广泛,但其在输出文件大小、图像色彩质量等许多方面的表现均不如视频。GIF动画相对于视频具有三个附加的特性:没有音轨、连续循环播放、加载完自动播放,替换成视频后类似于:

    <video autoplay muted loop playsinline>
        <source src="video.webm" type="video/webm">
        <source src="video.mp4" type="video/mp4">
    </video>

加载注意事项

首屏加载

  1. 由于网站页面所呈现的设备屏幕尺寸多种多样,如何判断首屏视窗的边界

  2. 若将首屏视窗边界线作为延迟加载触发的阈值,这并非最佳的性能考虑。更理想的做法是,在延迟加载的媒体资源到达首屏边界之前设置一个缓冲区,以便媒体资源在进入视窗之前就开始进行加载。资源占位

  3. 当延迟加载的媒体资源未渲染出来之前,应当在页面中使用相同尺寸的占位图像。如果不使用占位符,图像延迟显示出来后,尺寸更改可能会使页面布局出现移位。而用来占位的图像解决方案也有多种,十分简单的方式是使用一个与目标媒体资源长宽相同的纯色占位符,或者像之前使用的Base64图片。内容加载失败

  4. 当图片资源未能按预期成功加载时,所采取的具体处理措施应当依据应用场景而定。比如,当请求的媒体资源无法加载时,可将使用的图像占位符替换为按钮,让用户单击以尝试重新加载所需的媒体资源,或者在占位符区域显示错误的提示信息。总之,在发生任何资源加载故障时,给予用户必要的通知提示,总好过直接让用户无奈地面对故障。图像解码延迟渐进式的JPEG会先呈现出一个低像素的图像版本,随后会慢慢呈现出原图的样貌。这是因为图像从被浏览器请求获取,再到最终完整呈现在屏幕上,需要经历一个解码的过程,图像的尺寸越大,所需要的解码时间就越长。如果在JavaScript中请求加载较大的图像文件,并把它直接放入DOM结构中后,那么将有可能占用浏览器的主进程,进而导致解码期间用户界面出现短暂的无响应。JavaScript是否可用在通常情况下,我们都会假定JavaScript始终可用,但在一些异常不可用的情况下,开发者应当做好适配,不能始终在延迟加载的图像位置上展示占位符。可以考虑使用〈noscript〉标记。

代码优化

用户通过浏览器访问页面的过程,除了输入URL地址到所访问页面完成首屏渲染,更多的时候页面在响应与用户的交互。高性能网站对这个过程的要求是不仅执行顺畅无BUG,还希望对用户的页面操作能够更快速响应,而且在执行完任务的同时占用更少的资源。

数据存储

无论是哪种计算机编程语言,说到底它们的作用都是对数据的存取与处理,JavaScript也不例外。若能在处理数据之前,更快速地读取到数据,那么必然会对程序执行性能产生积极的作用。

  1. 数据存取方式:

施工中…